排序演算法總結(4)——歸併排序、基數排序

來源:互聯網
上載者:User

前三篇文章:

排序演算法總結(3)——交換排序

排序演算法總結(2)——選擇排序

排序演算法總結(1)——插入排序

四、歸併排序

歸併排序和快速排序一樣,是使用分治策略實現的排序演算法,演算法可以採用遞迴實現。所謂歸併,就是將兩個或兩個以上的有序資料序列合并成一個新的有序資料序列。

假設數組Array有N個元素,那麼可以看成數組Array是由N個有序的子序列組成,每個子序列的長度為1,然後再兩兩合并,得到了一個N/2個長度為2或1的有序子序列,再兩兩合并,如此重複,直到得到一個長度為N的有序資料序列為止,利用兩個有序序列的合并來實現歸併排序的排序方法,稱為二路歸併排序。

可以用迭代的思路寫代碼:

void Merge(int *a, int n, int *temp, int k){//k為有序數組的長度//一次二路歸併排序後的有序子序列存於數組temp中int head1 = 0;//前一個數組的起始位置int head2, tail1, tail2;//分別表示第一個 第二個有序自序列的頭尾int i,j,nTemp = 0;while (head1 + k < n-1){head2 = head1 + k;//第二個自序列的起始位置tail1 = head2 - 1;//第一個自序列的末尾tail2 = (head2+k-1 <= n - 1) ? (head2+k-1) : n-1;//第二個自序列的末尾//兩個有序自序列的歸併for (i = head1, j = head2; i <= tail1 && j <= tail2; nTemp ++){if (a[i] <= a[j]){temp[nTemp] = a[i];i ++;}else{temp[nTemp] = a[j];j ++;}}//自序列2歸併完,將自序列1放到臨時數組的後面while (i <= tail1){temp[nTemp] = a[i];i ++;nTemp ++;}//自序列1歸併完,將自序列2放到臨時數組的後面while (j <= tail2){temp[nTemp] = a[j];j ++;nTemp ++;}head1 = tail2 + 1;}//只夠一組的資料元素放到臨時數組中for (i = head1; i < n; i ++, nTemp++)temp[nTemp] = a[i];}void MergeSort(int *a, int n){int i,k=1;//k表示歸併長度從1開始int *temp;temp = (int *)malloc(n*sizeof(int));//動態申請臨時數組空間while (k<n){Merge(a,n,temp,k);//調用歸併函數for (i = 0; i < n; i++)a[i] = temp[i];//元素從臨時數組放回原數組k = 2 * k;//歸併長度加倍}free(temp);}

五、基數排序

基數排序演算法的基本思想是:設待排序的資料元素關鍵字是m位d進位整數(不足m位的關鍵字在高位補0),設定d個桶,令其編號分別為0,1,2,...,d-1。首先,按關鍵字最低位的數值依次把各資料元素放到相應的桶中;然後,按照桶號從小到大和進人桶中資料元素的先後次序收集分配在各桶中的資料元素;這樣,就形成了資料元素集合的一個新的排列,稱這樣的一次排序過程為一次基數排序。再對一次基數排序得到的資料元素序列按關鍵字次低位的數值依次把各資料元素放到相應的桶中,然後按照桶號從小到大和進人桶中資料元素的先後次序收集分配在各桶中的資料元素。這樣的過程重複進行,當完成了第m次基數排序後,就得到了排好序的資料元素序列。

是一個排序{710,342,045,686,006,841,429,134,068,264}的例子.

鏈式隊列是實現基數排序常用的方法。

在基於鏈式隊列的基數排序演算法中,可以把d個隊列設計成一個隊列數組(設隊列數組名為tub),隊列數組的每個元素中包括兩個域:front域和rear域。front域用於指示隊頭,rear域用於指示隊尾。當第 i ( i = 0,1,2,..,d一1)個隊列中有資料元素要放入時,就在隊列數組的相應元素tub[i]中的隊尾位置插人一個結點。基於鏈式隊列基數排序演算法的儲存結構。

代碼省略。

六、效能比較

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.