堆排序

堆排序的原理不用解释了,实现了一个简易的堆排序算法,放到这里,以后可以直接拿来用。

首先是调整堆的例程:

      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~

posted @ 2012-05-22 15:32  CobbLiu  阅读(578)  评论(1编辑  收藏  举报