堆排序
堆排序的原理不用解释了,实现了一个简易的堆排序算法,放到这里,以后可以直接拿来用。
首先是调整堆的例程:
void heapAdjust(int arr[], int s, int m):假设堆arr中除s以外的其余元素都满足堆定义,此函数调整s关键字,使[s:m]成为一个大根堆
1 void heapAdjust(int arr[], int s, int m)
2 {
3 int j;
4 int rc = arr[s];
5 for(j = 2*s; j < m; j = j*2)
6 {
7 if(j<m && arr[j]<arr[j+1])
8 j++;
9 if(rc >= arr[j])
10 break;
11 arr[s] = arr[j];
12 s = j;
13 }
14 arr[s] = rc;
15 }
然后是我们的堆排序
void heapsort(int arr[], int size):
1)将[0:size-1]范围内的元素建成一个大根堆
2)以此将根元素与最后一个元素调换并重新调整堆及堆大小。
1 void heapsort(int arr[], int size)
2 {
3 int i, tmp;
4
5 //建一个大根堆
6 for(i = size/2; i >= 0; i--)
7 heapAdjust(arr, i, size);
8
9 for(i = size-1; i >= 0; i--)
10 {
11 tmp = arr[0];
12 arr[0] = arr[i];
13 arr[i] = tmp;
14
15 heapAdjust(arr, 0, i-1);
16 }
17 }
Over~