歸併排序和快速排序C

2021-10-24 21:23:58 字數 3591 閱讀 6013

\qquad

本文主要展示歸併排序和快速排序

快速排序和歸併排序為什麼可以將時間複雜度由其他演算法的o(n

2)

o(n^2)

o(n2

)降低到o(n

log2

n)

o(nlog_)

o(nlog

2​n)

???

快速排序的時間複雜度跟每次排序選取的元素在排序後陣列的位置有關,越靠近陣列中間,排序的速度越快。當每次元素選擇最佳(排序區域的中間),只需要log

2n

log_n

log2​n

次便能達到最小分割槽(sta

rt==

en

dstart == end

start=

=end

),每次分割槽需要n

nn次,所以最後時間複雜度為o(n

∗log

2n

)o(n*log_2n)

o(n∗lo

g2​n

)。歸併排序的時間複雜度比較穩定,陣列經過o(l

og2n

)o(log_2n)

o(log2

​n)次實現陣列的最小分割,再經過log

2n

log_2n

log2​n

次數組合並,合併過程中進行陣列排序,每層合併需要n

nn次運算,所以最後的時間複雜度為o(n

∗log

2n

)o(n*log_2n)

o(n∗lo

g2​n

)。swap(int* index1, int* index2) 交換函式

void

swap

(int

* index1,

int* index2)

// 交換函式, 實現陣列元素的交換

;

partition(int* array, int start, int end) 排序函式
int

partition

(int

* array,

int start,

int end)

}// 一次遍歷之後,small + 1 指向的元素大於選取的元素

++small;

// 指向該元素

swap

(&array[end]

,&array[small]);

// 交換選取的元素和small,此時選取元素在陣列的位置為排序後的正確位置

return small;

// 返回選取的元素

};

quicksort(int *array, int start, int end, int arraylength) 遞迴呼叫排序函式
void

quicksort

(int

*array,

int start,

int end,

int arraylength)

;

quicksortfun() 測試函式
void

quicksortfun()

;int arraylength =

sizeof

(array)

/sizeof

(array[0]

);for(

int i =

0; i < arraylength;

++i)

std::cout << array[i]

<<

" ";

std::cout << std::endl;

quicksort

(array,

0, arraylength -

1, arraylength);}

;

void merge(int* array, int* array1, int arraylength1, int* array2, int arraylength2)合併函式
void

merge

(int

* array,

int* array1,

int arraylength1,

int* array2,

int arraylength2)

// 合併函式

else

}while

(i < arraylength1) array[k++

]= array1[i++];

// 當array2陣列遍歷完成,array1陣列未遍歷完成

while

(j < arraylength2) array[k++

]= array2[j++];

// 當array1陣列遍歷完成,array2陣列未遍歷完成

};

void mergesort(int* array, int arraylength)分割函式
void

mergesort

(int

* array,

int arraylength)

// 陣列分割

for(

int j =

0; j < arraylength - middle;

++j)

mergesort

(array1, middle)

;// 遞迴呼叫 分割函式

mergesort

(array2, arraylength - middle)

;// ...

merge

(array, array1, middle, array2, arraylength - middle)

;// 合併分割後的陣列

delete

array1;

// 刪除新開闢的空間

delete

array2;

// ...

};

mergefun() 測試函式
void

mergefun()

;int arraylength =

sizeof

(array)

/sizeof

(array[0]

);for(

int i =

0; i < arraylength;

++i)

std::cout << array[i]

<<

" ";

std::cout << std::endl;

mergesort

(array, arraylength)

;for

(int i =

0; i < arraylength;

++i)

std::cout << array[i]

<<

" ";

std::cout << std::endl;

};

希望大家多提程式優化和程式設計規範的意見 !!!

歸併排序和快速排序

歸併排序 先將問題分解為小問題即乙個個子序列,再將子串行按順序合併。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...