排序算法——归并排序
生活随笔
收集整理的這篇文章主要介紹了
排序算法——归并排序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
二路歸并排序
7.1 二路歸并排序的思想
- 一次排序過程,將已經(jīng)各自有序的兩個段的數(shù)據(jù)合并一個段,并且合并后依舊有序。
- 第一次我們認為單個數(shù)據(jù)是有序的,一個數(shù)據(jù)就是一個段,一次排序后,兩個數(shù)據(jù)就是一個有序數(shù)據(jù)段,這樣下一次每個有序數(shù)據(jù)段就是兩個數(shù)據(jù)。最后將其合并成一個完成有序段,則整個數(shù)據(jù)就已經(jīng)排序好了。
7.1二路歸并排序的實現(xiàn)
void Meger(int *arr, int len, int width, int *brr) {int low1 = 0;int high1 = low1 + width - 1; // high1為第一個段的結(jié)束位置下標int low2 = high1 + 1;int high2 = low2 + width > len ? len - 1 : low2 + width - 1;int index = 0;// 處理有兩個歸并段while (low2 < len){// 兩個歸并段都有未歸并數(shù)據(jù)while (low1 <= high1 && low2 <= high2){if (arr[low1] < arr[low2]) brr[index++] = arr[low1++];else brr[index++] = arr[low2++];}//只剩下一個歸并段數(shù)據(jù)while (low1 <= high1) brr[index++] = arr[low1++];while (low2 <= high2) brr[index++] = arr[low2++];low1 = high2 + 1;high1 = low1 + width - 1;low2 = high1 + 1;high2 = low2 + width > len ? len - 1 : low2 + width - 1;}//處理只剩下一個歸并段的情況while (low1 < len) brr[index++] = arr[low1++];//將brr中的數(shù)據(jù)全部復(fù)制到arr中for (int i = 0; i < len; ++i) arr[i] = brr[i]; }void MegerSort(int *arr, int len) {int *brr = (int *)malloc(sizeof(int) * len);assert(brr != NULL);// i就是每個段當前的數(shù)據(jù)個數(shù)for (int i = 1; i < len; i *= 2){Meger(arr, len, i, brr);}free(brr); }總結(jié)
以上是生活随笔為你收集整理的排序算法——归并排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序算法——堆排序
- 下一篇: 排序算法——基数排序