1. 程式人生 > >7中排序演算法

7中排序演算法

氣泡排序:最簡單的一種排序演算法。先從陣列中找到最大值(或最小值)並放到陣列最左端(或最右端),然後在剩下的數字中找到次大值(或次小值), 以此類推,直到陣列有序排列。演算法的時間複雜度為O(n^2)。 for (int i=0;i<10;i++)     {         for (int j=i+1;j<10;j++)         {             if (a[i]>a[j])             {                 temp = a[j];                 a[j] = a[i];                 a[i] = temp;             }         }     }      for (int i=0;i<10;i++)     {         for (int j=9;j>=i+1;j--)         {             if (a[j-1]>a[j])             {                 temp = a[j];                 a[j] = a[j-1];                 a[j-1] = temp;             }         }     }   第二種應該是正統的,符合那個邏輯流程的氣泡排序   2、選擇排序   嚴蔚敏版《資料結構》中對選擇排序的基本思想描述為:每一趟在n-i+1(i=1,2,...,n-1)個記錄中選取關鍵字最小的記錄作為有序序列中第i個記錄。 具體來說,假設長度為n的陣列arr,要按照從小到大排序,那麼先從n個數字中找到最小值min1,如果最小值min1的位置不在陣列的最左端(也就是min1不等於arr[0]), 則將最小值min1和arr[0]交換,接著在剩下的n-1個數字中找到最小值min2,如果最小值min2不等於arr[1],則交換這兩個數字,依次類推,直到陣列arr有序排列。 演算法的時間複雜度為O(n^2)。   int  a[10] = { 5,6,9,8,9,6,3,5,1,3 };     int temp = -1;     int index = 0;     for (int i=0;i<10;i++)     {         index = i;         temp = a[i];//每次進入排序的時候,假設自己為最小的         for (int j=i+1;j<10;j++)         {             if (temp>a[j])             {                 index = j;//如果發現自己不是最小的,那麼就記錄這個值,和下標的值                 temp = a[j];             }         }         a[index] = a[i];         a[i] = temp;//互相交換值     }     for (int i=0;i<10;i++)     {         cout << a[i] << " ";     }      3.插入排序的基本思想就是將無序序列插入到有序序列中。例如要將陣列arr=[4,2,8,0,5,1]排序,可以將4看做是一個有序序列(圖中用藍色標出), 將[2,8,0,5,1]看做一個無序序列。無序序列中2比4小,於是將2插入到4的左邊,此時有序序列變成了[2,4],無序序列變成了[8,0,5,1]。無序序列中8比4大 ,於是將8插入到4的右邊,有序序列變成了[2,4,8],無序序列變成了[0,5,1]。以此類推,最終陣列按照從小到大排序。該演算法的時間複雜度為O(n^2)。   這是我初步寫的,算是半成品的插入排序吧, for (int i=1;i<10;i++)//新插入的i下標     {         for (int j=0;j<i;j++)//已經拍好序的部分,初始是第一位0假設排好序了         {             if (a[i]<a[j])             {                 temp = a[j];                 a[j] = a[i];                 a[i] = temp;             }         }         for (int i = 0; i < 10; i++)         {             cout << a[i] << " ";         }         printf("\n");     }      下面這個才是符合插入排序邏輯的插入排序:     int  a[10] = { 8,9,6,3,5,7,1,2,4,0};     int temp = -1;     int index = 0;     for (int i=1;i<10;i++)     {         temp = a[i];//要插入的數         for (index =i-1; index >=0; index--)         {             if (temp<a[index])             {                 a[index + 1] = a[index];             }             else             {                 break;             }             for (int i = 0; i < 10; i++)             {                 cout << a[i] << " ";             }             printf("\n");         }         a[index + 1] = temp;     }     for (int i = 0; i < 10; i++)     {         cout << a[i] << " ";     }     printf("\n");