交換排序


  交換排序的基本思想是兩兩比較待排序元素的關鍵字,發現這兩個元素的次序相反時即進行交換,直到沒有反序的元素為止。本次介紹兩種交換排序,即冒泡排序和快速排序

1 冒泡排序

1. 1 算法步驟

  比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

  對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。

  針對所有的元素重復以上的步驟,除了最后一個。

  持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

 

實際上,一旦算法中的某一趟比較時不出現任何元素交換,說明已經排序好了,就可以結束本算法。

 

 1 void BubbleSort(RecType arr[],int n)  2 {   int i,j;  3     bool exchange;  4     for(i=0;i<n-1;i++)  5  {  6         exchange=false;             //一趟前exchange置為false
 7         for(j=n-1;j>i;j--)  8  {  9             if(arr[j]<arr[j-1]) 10  { 11                 swap(arr[j],arr[j-1]);   //元素交換
12                 exchange=true; 13  } 14  } 15         if(!exchange)//本趟沒有發生交換,中途結束算法
16            return; 17  } 18 }

冒泡排序的平均時間復雜度為O(n2),是一種穩定的排序方法。

 

2 快速排序(遞歸的方式做)

快速排序(Quick Sort)使用分治法策略。
它的基本思想是:選擇一個基准數,通過一趟排序將要排序的數據分割成獨立的兩部分;其中一部分的所有數據都比另外一部分的所有數據都要小。然后,再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

快速排序流程:
(1) 從數列中挑出一個基准值。
(2) 將所有比基准值小的擺放在基准前面,所有比基准值大的擺在基准的后面(相同的數可以到任一邊);在這個分區退出之后,該基准就處於數列的中間位置。
(3) 遞歸地把"基准值前面的子數列"和"基准值后面的子數列"進行排序。

 

 1 int partition(RecType arr[],int s,int t)  2 {   int i=s,j=t;  3     RecType tmp=arr[i];  //以arr[i]為基准
 4     while(i<j)   //從兩端交替掃描,右邊先開始。直到i=j 為止
 5     {   while(j>i && arr[j]>tmp)  //從右向左掃描,找到一個小於tmp的
 6             j--;                  //arr[j],找到的話,放入arr[i]處
 7         a[i]=a[j];  8 
 9         while(i<j && tmp>=arr[i]) //從左向右掃描,找到一個大於tmp的
10             i++;                  //arr[i]。找到的話,放入arr[j]處
11         a[j]=a[i]; 12 
13  } 14     a[i]=tmp; 15     return i; 16 } 17 
18 void QuickSort(RecType arr[],int s,int t)  //對arr[s,t]的元素進行快速排序 增序
19 { 20     int i; 21     if(s<t) 22     {   i=partition(arr,s,t); 23         QuickSort(arr,s,i-1);//對左區間遞歸排序
24         QuickSort(arr,i+1,t); //對右區間遞歸排序
25  } 26 }

 

快速排序的平均時間復雜度為O(nlog2n),是不穩定的排序方法

 

 

 

 

 


免責聲明!

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



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