堆排序 快速排序 歸併排序總結

2022-08-17 13:45:15 字數 3003 閱讀 7171

二分查詢及其擴充套件應用場景

大端和小端的問題

2012-09-21 11:33:41

|  分類:

演算法、資料結構

|  標籤:

演算法資料結構

歸併排序

內部排序面試

|舉報|字型大小大中小

訂閱這三個排序以前都寫過,快速排序還寫了遞迴版和迭代版。現在在這裡做一下總結。

堆排序(heap sort)

堆排序是一種樹形選擇排序,在排序過程中,將a[n]看成是完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係來選擇最小的元素。對n個元素從小到大排序建立大根堆,然後交換堆頂與最後乙個元素,將剩下的n-1個元素調整為大根堆,執行n-1此這樣的操作。 堆排序是不穩定的。演算法時間複雜度o(nlogn)。

[cpp]view plain

copy

print

?//調整大根堆

void

heapadjust(

intdata,

intnstart,

intnlen) 

}  //change data

if(data[nstart] < data[nmaxchild]) 

else

}  }  //堆排序 從小到大排序建立大頂堆

void

heapsort(

intdata,

intnlen) 

for(i = nlen-1; i > 0; i--) 

快速排序(quick sort)

快速排序是對氣泡排序的一種本質改進。它的基本思想是通過一趟掃瞄後,使得排序序列的長度能大幅度地減少。在氣泡排序中,一次掃瞄只能確保最大數值的數移到正確位置,而待排序序列的長度可能只減少1。快速排序通過一趟掃瞄,就能確保某個數(以它為基準點吧)的左邊各數都比它小,右邊各數都比它大。然後又用同樣的方法處理它左右兩邊的數,直到基準點的左右只有乙個元素為止。

快速排序是不穩定的。最理想情況演算法時間複雜度o(nlog2n),最壞o(n^2)。

[cpp]view plain

copy

print

?//快速排序

void

quicksort(

inta,

intlow,

inthigh) 

a[i] = pivot; 

// 對子序列快排

quicksort(a, low, i-1); 

quicksort(a, i+1, high); 

}  } 

//快速排序法的劃分操作

intpartition(

intvec,

intlow,

inthigh) 

//此時low==high

vec[low] = pivot; 

return

low; 

}  //in-place partition algorithm

//intin_place_partition(

int* array,

intleft,

intright) 

}  swap(array[right], array[index]); 

return

index; 

}  void

qsort(

int* array,

intleft,

intright) 

//非遞迴快速排序

void

quicksort2(

intvec,

intlow,

inthigh) 

if(mid+1 < high) 

//用棧儲存每個待排序子串的首尾元素下標,下一次迴圈時取出這個範圍,對這段子序列進行partition操作

while

(!st.empty()) 

if(mid+1

}  }  } 

歸併排序(merge sort)

基本思想是合併兩個有序表,設有兩個有序(公升序)序列儲存在同一陣列中相鄰的位置上,不妨設為a[l..m],a[m+1..h],將它們歸併為乙個有序數列,並儲存在a[l..h]。 歸併排序的時間複雜度無論是在最好情況下還是在最壞情況下均是o(nlog2n)。

歸併排序在最壞的情況下都是o(nlogn)的時間複雜度,缺點是merge的時候要有o(n)的額外的空間,如何改進?使用in-place merge sort:       關於原地歸併也可參考我前面的文章

[cpp]view plain

copy

print

?//將有序序列a[low..mid]和a[mid+1..high]歸併到a[low..high]。

void

merge(

inta,

intlow,

intmid,

inthigh) 

else

}  // 歸併剩餘元素

while

(i <= mid)  b[k++] = a[i++]; 

while

(j <= high)  b[k++] = a[j++]; 

// 從b複製回a

for(i = 0; i <= high-low; ++i) 

a[low+i] = b[i]; 

delete

b; 

}  //歸併排序

void

mergesort(

inta,

intlow,

inthigh) 

}  //自底向上的歸併排序

void

mergesort2(

inta,

intn) 

}

快速排序 堆排序 歸併排序

快速排序 includeusing namespace std int a 8 int sz sizeof a sizeof int int partition int a,int p,int r int main const int sz sizeof a sizeof int 堆化 保持最大堆的...

快速排序,歸併排序,堆排序

l r 1在奇數長度陣列的中間,偶數長度陣列的左半邊最後乙個,極限情況下陣列只有兩個數,i遇到第乙個數就會停下,此時模擬i,j下標的數有無交換的情況,會發現j在停下來時都位於第乙個數的位置,因此用j,j 1才不會越界 l r 1 1在奇數長度陣列的中間往右第乙個,偶數長度陣列的右半邊第乙個,極限情況...

關於快速排序,歸併排序,堆排序

1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...