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