[排序算法] 交換排序(2種)


1.冒泡排序

【思想】不停地比較相鄰的記錄,如果不滿足排序要求就交換相鄰數據,直到所有的記錄都已經排好序

【特點】穩定

 空間代價:O(1)

 時間代價:O(n^2)

 -比較次數        -交換次數 

·最少:O(n)      ·最少:0

·最多:O(n^2)     ·最多:O(n^2)

 1 void BubbleSort(int Array[], int n)
 2 {
 3     bool NoSwap;            // 是否發生了交換的標志
 4     int i, j;
 5     for(i = 0; i < n-1; i ++)
 6     {
 7         NoSwap = true;        // 標志初始為真
 8         for(j = n - 1; j > i; j --)
 9             if(Array[j] < Array[j-1])  // 判斷是否逆置
10             {
11                 swap(Array[j], Array[j - 1]);    // 交換逆置對
12                 NoSwap = false;    // 發生了交換,標志變為假
13             }
14         if (NoSwap) return;        // 沒發生交換,則排好序
15     }
16 }

2.快速排序

【思想】基於分治法的排序

·選擇軸值(pivot)

·將序列划分為兩個子序列L和R,使得L中的所有記錄都小於或等於軸值,R中的記錄都大於軸值

·對子序列L和R遞歸進行快速排序

【特點】不穩定

 空間代價:O(logn)

 時間代價:O(nlogn)

分治策略的基本思想:

 -分 -- 划分子問題

 -治 -- 求解子問題(子問題不重疊)

 -合 -- 綜合解

軸值選擇:

·盡可能使L,R長度相等

·選擇策略:

 -選擇最左邊記錄(第一個記錄)

  -隨機選擇

  -選擇平均值

分割過程(整個快速排序的關鍵):

·分割算法1

(1)備份軸值(首記錄)

(2)取兩個指針low和high,初始值就設為第二個元素和最后一個元素的下標,low <= high

(3)移動兩個指針

  ·從high所指位置向左搜索,找到第一個比軸值小的元素

  ·從low所指位置向右搜索,找到第一個比軸值大的元素

(4)交換low和high兩位置的值

(5)重復(3)、(4)兩步驟的過程,直到low > high

(6)把軸放在high所指的位置

 1 int Partition1(int Array[], int first, int last)
 2 {
 3     int low = first + 1,high = last;
 4     int pivot = Array[first];
 5     while(low <= high)
 6     {
 7         while(low <= high && Array[low] <= pivot) low++;
 8         while(low <= high && Array[high] > pivot) high --;
 9         if(low < high)
10             swap(Array[high--] , Array[low++]);
11     }
12     swap(Array[first],Array[high]);
13     return high;
14 }
15 void QSort(int Array[], int first, int last)
16 {
17     if(first < last)
18     {
19         int x = Partition1(Array,first,last);
20         QSort(Array,first,x - 1);
21         QSort(Array,x + 1,last);
22     }
23 }

·分割算法2

(1)備份軸值(首記錄)

(2)取兩個指針low和high,初始值就是序列兩端的下標,保證low <= high

(3)移動兩個指針

  ·從high所指位置向左搜索,找到第一個比軸值小的元素,將其放在low的位置

  ·從low所指位置向右搜索,找到第一個比軸值大的元素,將其放在high的位置

(4)交換low和high兩位置的值

(5)重復(3)、(4)兩步驟的過程,直到low = high

(6)把軸放在low所指的位置

 1 int Partition2(int Array[], int first, int last)
 2 {
 3     int low = first, high = last;
 4     int pivot = Array[first];
 5     while(low < high)
 6     {
 7         while(low <= high && Array[high] >= pivot) high --;
 8         Array[low] = Array[high];
 9         while(low < high && Array[low] <= pivot) low ++;
10         Array[high] = Array[low];
11     }
12     Array[low] = pivot;
13     return low;
14 }
15 void QSort(int Array[], int first, int last)
16 {
17     if(first < last)
18     {
19         int x = Partition2(Array,first,last);
20         QSort(Array,first,x - 1);
21         QSort(Array,x + 1,last);
22     }
23 }

 


免責聲明!

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



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