最簡單排序——冒泡排序


剛開始學習冒泡排序的時候老師是這樣介紹的。

冒泡排序:遍歷要排序的元素列,依次比較兩個相鄰的元素,如果他們順序錯誤,則交換。

算法原理(升序排列):比較第一個和第二個元素,如果第一個比第二個大則交換他們。

           對每一個元素都做同樣的操作,從第一對到最后一對。這樣就可以把最大的元素放到了最后。

           再重復以上的操作,除了最后一個,這樣就找到了剩余的最大元素,放到倒數第二位。

           繼續循環,直到沒有元素需要比較。

下面是代碼的實現:

template<typename T>

void bubble_sort(T arr[],int len)
{
    int i,j;
    T tmp;
    for(i=0;i<len-1;i++)        //需要循環的次數  2 4 6 3 7    n個元素循環n-1次
        for(j=0;j<len-i-1;j++)  //每次比較剩余的元素即可  所以 j<len-1-i;
            if(arr[j]>arr[j+1])
            {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
}

這里需要說一下  template<typename T>    這是個模板,因為我們不確定在實際中要比較的數據類型,所以我們用這種方式。C++中的只是。

 

我們設想一下   如果我們要比較的元素本來就是有序的,上述的寫法是不是i的循環是不是浪費了。

1 2 3 4 5 6 7 8 9 10    上面的寫法for循環會執行9次

所有我們需要來改進一下 設置一個標示符可以解決這個問題。

void bubble_sort(T arr[],int len)
{
    int i,j;
    T tmp;
    int flag = 1;
    for(i=0;i<len-1&&flag;i++)     如果序列有序則不進入循環
        for(j=0,flag=0;j<len-i-1;j++)
            if(arr[j]>arr[j+1])
            {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
                flag = 1;
            }
}

  

最后我們用主函數來測試我們的算法

int main()
{
    int arr[] = {61,17,29,22,34,60,72,21,50,1,62};
    int len = (int) sizeof(arr) / sizeof(*arr);
    bubble_sort(arr,len);
    int i;
    for(i=0;i<len;i++)
        cout << arr[i] << ' ';
    cout << endl;


    float arrf[] = {17.5,19.1,0.6,1.9,10.5,12.4,3.8,19.7,1.5,25.4,28.6,4.4,23.8};
    len = (int)sizeof(arrf) / sizeof(*arrf);
    bubble_sort(arrf,len);
    for(i=0;i<len;i++)
        cout << arrf[i] << ' ';
    cout << endl;
    return 0;

}

  

 

           


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM