兩種分治排序 歸併排序和快速排序(C語言)

2021-08-14 02:27:02 字數 2537 閱讀 9765

歸併排序:

思想為:在對待排序列設定乙個中心點,以此為界左右進行拆分。在左子串行和右子串行遞迴執行上述過程,直到每個序列只有乙個元素,拆分不動為止。

然後對相鄰元素進行合併。待合併完成為乙個大序列後,對相鄰的大序列遞迴執行這個過程,到整個序列的左、右序列合併完了,整個排序便完了。

合併思想為:搞兩個指標分別指向左、右子串行的頭元素。開闢乙個新陣列存放結果,大小等同於左右子串行的和。通過倆指標逐個比較元素大小,對於公升序而言,左右序列中哪個小就將小的那個放到新陣列中。已經放到結果陣列中的序列指標記得前移,當然結果陣列指標也要前移。重複這一過程,直到左或右序列中指標已經到底了。把剩下的那個序列中元素全部移到結果陣列中即可。

#include #include #include void display(int arr, int low, int high);

void merge_sort(int arr, int low, int high);

void merge(int arr,int low, int mid, int high);

int main(int argc, char * argv)

; int len = (int)(sizeof(arrtosort)/sizeof(int));

printf("len is: %d\n",len);

merge_sort(arrtosort, 0, len-1);

display(arrtosort, 0, len-1);

}void display(int arr, int low, int high)

printf("\n");

}void merge_sort(int arr, int low, int high)

void merge(int arr,int low, int mid, int high)

else

} while(i > mid && j <= high)

while(j > high && i <= mid)

int *add = tmp;

memcpy(&arr[low],add,sizeof(tmp));

// for(int i = 0;i <= len-1;i++)

// arr[low+i] = tmp[i];

printf("after merge: ");

display(arr, low, high);

}

快速排序:在對待排序列選乙個基準元素,考慮到方便第乙個元素就行,備份此基準元素值。用兩個指標分別指向原序列的頭和尾。對於公升序,用尾指標元素和基準值比較,如大等於基準值則尾指標前移,直到尾指標元素小於基準值頭尾指標相等。此時把尾指標元素copy到基準值元素的位置。當然原頭指標元素既已被覆蓋,頭指標要後移。

現在尾指標元素已經被copy,相當於尾指標元素位置也空出來了,現在是對頭指標元素進行操作的時候了。與尾指標相反,用頭指標元素和基準值比較,如小等於基準值則頭指標後移,直到頭指標元素大於基準值頭尾指標相等。此時把頭指標元素copy到尾指標元素的位置。當然尾指標元素既已被覆蓋,尾指標要前移。

現在頭指標/尾指標元素都被移動過了,重複上述過程:用尾指標元素和基準值比較。。,用頭指標元素和基準值比較。。。直到頭尾指標相等,此時把之前被覆蓋掉的基準元素填入該頭指標的位置,這輪排序完結。

以當前基準元素為止分割元序列為兩個序列,分別重複上述整個過程(遞迴呼叫quick_sort)。

左側子串行:

右側子串行:

當整個原序列已被分割到單個元素時(也是quick_sort退出條件),所有排序已完成。

#include #include void quick_sort(int a, int low, int high)

{ int i, j, pivot;

if (low < high){

pivot = a[low];

i = low;

j = high;

while(i=pivot)

j--;

if(i快排在空間複雜度上更勝於歸併。歸併需要額外空間,而快排直接在原序列上操作。

分治演算法 快速排序,歸併排序

快速排序 分析 資料結構p186.重要 當原始檔有序時複雜度是o n2 此時氣泡排序最好,無序時快速排序是最好的方法。void quicksort int a,int l,int r int i l int j r int x a i a l 即a i 就是第乙個坑 挖坑填數 while j i i...

歸併排序 快速排序 分治思想

蒟蒻來水一篇博文方便複習參考 快速排序的基本原理 隨機選擇乙個基點,將比基點大的元素放在基點左側,將比基點小的元素放在基點右側。然後再分別只看基點左側和右側,重複上述過程。由於其利用了分治思想,在平均狀態下其時間複雜度為o nlogn 基本 如下 includeusing namespace std...

分治法 快速排序 歸併排序 堆排序

十種常見排序演算法可以分為兩大類 非線性時間比較類排序 通過比較來決定元素間的相對次序,由於其時間複雜度不能突破o nlogn 因此稱為非線性時間比較類排序。線性時間非比較類排序 不通過比較來決定元素間的相對次序,它可以突破基於比較排序的時間下界,以線性時間執行,因此稱為線性時間非比較類排序。0.2...