排序 歸併排序和快速排序

2022-08-18 01:12:10 字數 3246 閱讀 3228

1,歸併排序的基本思想:

1,將兩個或兩個以上的有序序列合併成乙個新的有序序列,比如有序序列

v[0] ... v[m] 和 v[m+1] ... v[n-1] 合併為 v[0] ... v[n-1],這種歸併方法稱為 2 路歸併;

1,必須大於 1 個有序序列;

2,必須有序;

2,歸併的套路:

1,將 3 個有序序列歸併為乙個新的有序序列,稱為 3 路歸併;

2,將 n 個有序序列歸併為乙個新的有序序列,稱為 n 路歸併;

3,將多個有序序列歸併為乙個新的有序序列,稱為多路歸併;

3,2 路歸併示例:

4,歸併排序的**實現及其示例:

1,歸併要用額外的空間;

5,歸併排序 sort::merge 的實現:

1

/*實現 merge 函式,真正的做歸併的操作了

*/2 template 3

static

void merge(t src, t helper, int begin, int mid, int end, bool

min2max)416

else

1720}21

22while( i <= mid ) //

當上面的某一路達到尾部沒有了,而另一路還有元素的時候,當這一路是左邊的元素時

2326

27while( j <= end ) //

當上面的某一路達到尾部沒有了,而另一路還有元素的時候,當這一路是右邊的元素時

2831

32for(i=begin; i<=end; i++) //

將最終的元素全都從輔助空間拷貝到原始的空間

中去3336}

3738

/*二路歸併排序,需要遞迴排序完成;第乙個引數是需要歸併排序的資料,第二個引數是歸併排序的輔助空間,第三個引數是排序範圍中的起始位置,第四個引數是排序範圍中的結束位置;

*/39 template //

遞迴40

static

void merge(t src, t helper, int begin, int end, bool

min2max)

4149}50

51/*

歸併排序,這個函式對介面的處理很到位

*/52 template //

需要額外的空間才能完成,空間複雜度為 o(n),時間復

雜度為 o(n*logn),穩定的排序法

53static

void merge(t array, int len, bool min2max = true)54

6263

delete

helper;

64    }

6,快速排序的基本思想:

1,任取序列中的某個資料元素作為基準將整個序列劃分為左右兩個子串行:

1,左側子串行中所有元素都小於或等於基準元素;

2,右側子串行中所有元素都大於基準元素;

3,基準元素排在這兩個子串行中間;

2,分別對這兩個子串行重複進行劃分,直到所有的資料元素都排在相應位置上為止;

7,快速排序示例和元素排序示例及示例分析:

1,劃分的結果就是基準就位,返回值就是基準就位的下標;

8, 快速排序 sort::quick 實現(僅 *.cpp 檔案):

1

/*快速排序的分割函式,返回值是下標,所以是 int,對陣列 array 進行劃分,二三兩個引數為劃分範圍

*/2 template 3

static

int partition(t array, int begin, int end, bool

min2max)413

14 swap(array[begin], array[end]); //

把較小的資料元素放到前面,然後開始下面的較小端的比較,能夠直接使 begin 先加 1,交換元素

1516

while( (begin < end) && (min2max ? (array[begin] <= pv) : (array[begin] >= pv)) ) //

實現不同順序的排序

1720

21 swap(array[begin], array[end]); //

把較大的資料元素放到後面,然後開始下面的較大端的比較,能夠直接使 end 再加 122}

2324 array[begin] = pv; //

將分割的基準值放到合適的位置

25return begin; //

返回基準最終下標26}

2728

/*遞迴實現快速排序

*/29 template 30

static

void quick(t array, int begin, int end, bool

min2max )

3138}39

40/*

快速排序

*/41 template //

時間複雜度是 o(n*logn),不穩定排序

42static

void quick(t array, int len, bool min2max = true)43

46 template //

時間複雜度是 o(n*logn),不穩定排序

47static

void quick(t array, int len, bool min2max = true)48

9,小結:

1,歸併排序需要額外的輔助空間才能完成,空間複雜度為 o(n);

2,歸併排序的時間複雜度為 o(n*logn),是一種穩定的排序法;

3,快速排序通過遞迴的方式對排序問題進行劃分;

4,快速排序的時間複雜度為 o(n*logn),是一種不穩定的排序法;

歸併排序和快速排序

歸併排序 先將問題分解為小問題即乙個個子序列,再將子串行按順序合併。class mergesort mergesort a,0 a.length 1 for int t a public static void mergesort int a,int m,int n public static vo...

歸併排序和快速排序

歸併排序的陣列排序任務可以如下完成 1 把前一半排序 2 把後一半排序 3 把兩半歸併到乙個新的有序陣列,然後再拷貝回原陣列,排序完成。include using namespace std void merge int a,int s,int m,int e,int tmp while p1 m ...

快速排序和歸併排序

遞推公式 merge sort p,r merge merge sort p,q merge sort q 1 r 終止條件 p r 10組測試資料 for let i 0 i 10 i 生成10個隨機元素的測試陣列 function gettestdata return ret 排序函式 func...