简单选择排序
void SelectSort(ElemType A[]. int n) {
for(i = 0; i < n - 1; i++) {
min = i;
for(j = i + 1; j < n; j++) {
if(A[j] < min) min = j;
}
if(min != i) swap(A[i], A[min]);
}
}
- 空间复杂度:O(1)
- 时间复杂度:O(n2)
- 算法稳定性:不稳定
- 移动次数和比较次数:最好的情况是移动0次,最多不会超过3(n-1);比较次数恒为n(n - 1) / 2
堆排序
void BuildMaxHeap(ElemType A[], int len) {
for(int i = len / 2; i > 0; i--)
HeadAdjust(A, i, len);
}
void HeadAdjust(ElemType A[], int k, int len) {
A[0] = A[k];
for(i = 2 * k; i <= len; i *= 2) {
if(i < len && A[i] < A[i + 1]) {
i++;
}
if(A[0] >= A[i]) break;
else {
A[k] = A[i];
k = i;
}
}
A[k] = A[0];
}
void HeapSort(ElemType A[], int len) {
BuildMaxHeap(A, len);
for(i = len; i > 1; i--) {
swap(A[i], A[1]);
HeadAdjust(A, 1, i - 1);
}
}
- 空间复杂度:O(1)
- 时间复杂度:O(nlog2n)
- 算法稳定性:不稳定
建堆的过程关键字对比次数不超过4n,建堆时间为O(n),调整时间为O(h)