voidHeapify(int A[], int n, int i){ int largest = i; int l = 2*i + 1, r = 2*i + 2; if(l < n && A[l] > A[largest]) largest = l; if(r < n && A[r] > A[largest]) largest = r; if(largest != i){ int tmp = A[i]; A[i] = A[largest]; A[largest] = tmp; Heapify(A, n, largest); } }
voidHeapSort(int A[], int n){ for(int i = n/2-1; i >= 0; i--) Heapify(A, n, i); for(int i = n-1; i > 0; i--){ int tmp = A[0]; A[0] = A[i]; A[i] = tmp; Heapify(A, i, 0); } }
算法分析:
时间复杂度:O(n log n)
空间复杂度:O(1)
稳定性:不稳定
二、非比较排序
8. 计数排序
基本思想: 统计每个值出现的次数,根据计数信息将元素放到正确位置。适用于数据范围较小的整数序列。
1 2 3 4 5 6 7 8 9 10 11
voidCountingSort(int A[], int n, int k){ int count[k+1], output[n]; for(int i = 0; i <= k; i++) count[i] = 0; for(int i = 0; i < n; i++) count[A[i]]++; for(int i = 1; i <= k; i++) count[i] += count[i-1]; for(int i = n-1; i >= 0; i--){ output[count[A[i]]-1] = A[i]; count[A[i]]--; } for(int i = 0; i < n; i++) A[i] = output[i]; }
intGetMax(int A[], int n){ int mx = A[0]; for(int i = 1; i < n; i++) if(A[i] > mx) mx = A[i]; return mx; }
voidCountSortByDigit(int A[], int n, intexp){ int output[n], count[10] = {0}; for(int i = 0; i < n; i++) count[(A[i]/exp)%10]++; for(int i = 1; i < 10; i++) count[i] += count[i-1]; for(int i = n-1; i >= 0; i--){ output[count[(A[i]/exp)%10]-1] = A[i]; count[(A[i]/exp)%10]--; } for(int i = 0; i < n; i++) A[i] = output[i]; }
voidRadixSort(int A[], int n){ int m = GetMax(A, n); for(intexp = 1; m/exp > 0; exp *= 10) CountSortByDigit(A, n, exp); }