快排:
快速排序主要運用了二分的思想,每次選擇一個基準元素,比基準元素打的元素都放在基準元素前面,比基準元素小的元素都放在基準元素後面,這樣不斷遞迴細分,完成排序。 C++代碼實現:
void QuickSort(int a[], int l, int r){ int temp = a[l]; int i = l, j = r; if(l<r){ while(i<j){ while (i<j && a[j]>= temp) { j--; } if(i<j){ a[i] = a[j]; i++; } while(i<j && a[i] < temp){ i++; } if(i<j){ a[j] = a[i]; j--; } } a[i] = temp; QuickSort(a, l, i - 1); QuickSort(a, i + 1, r); }}
堆排序:
堆:完全二叉樹結構,以最大堆為例,所有節點的值均大於左右孩子節點的值,即a[i]>=a[i*2] && a[i]>=a[i*2+1] 。
堆排序:
1). 建立最大堆,堆頂元素為最大值。
2). 堆頂元素和最後一個元素交換,調整剩下的元素為最大堆,交換堆頂元素與最後一個元素,繼續調整…… C++代碼如下:
void MaxHeapFixDown(int a[], int i, int n){ int j = 2*i + 1; int temp = a[i]; while(j<n){ if(j+1<n&&a[j]<a[j+1]){ j++; } if(temp>a[j]){ break; }else{ a[i] = a[j]; i = j; j = 2*i+1; } } a[i] = temp;}void HeapSort(int a[], int n){ //構建最大堆 for(int i = n/2 - 1; i >= 0;--i){ MaxHeapFixDown(a, i, n); } //排序 for(int i = n-1;i>=1;--i){ swap(a[0], a[i]); MaxHeapFixDown(a, 0, i); }}