快排:
快速排序主要运用了二分的思想,每次选择一个基准元素,比基准元素打的元素都放在基准元素前面,比基准元素小的元素都放在基准元素后面,这样不断递归细分,完成排序。
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);
}
}