HeapSort,use maximun heap...

本文详细介绍了一种高效的排序算法——堆排序的实现过程。通过具体的C++代码示例,讲解了如何构建最大堆、堆调整以及堆排序的具体步骤,并演示了一个完整的堆排序程序,最后通过随机数测试验证了算法的有效性。
  1. /*
  2. 建议大家到这看:
  3. http://topic.youkuaiyun.com/u/20081129/21/81fb7e89-0df5-4911-9884-d05680705a3c.html
  4. */
  5. #include<iostream> 
  6. #include<ctime> 
  7. using namespace std;
  8. const int DefaultSize = 100;
  9. class MaxHeap
  10. {
  11. public:
  12.     MaxHeap(int sz);
  13.     int Parent(int i) { return i/2;}
  14.     int Left(int i) { return 2*i;}
  15.     int Right(int i) {return 2*i+1;}
  16.     void MaxHeapify(int* arr,int i);
  17.     void BuildMaxHeap(int* arr,int arrSize);
  18.     void HeapSort(int* arr,int arrSize);
  19. private:
  20.     //int* maxHeap; 
  21.     int currentSize;  //maxHeapSize; 
  22.     void Swap(int &i,int &j) {int t=i; i=j; j=t;}
  23. };
  24. MaxHeap::MaxHeap(int arrSize)
  25. {
  26.     currentSize = arrSize;
  27. }
  28. void MaxHeap::MaxHeapify(int *arr,int i)
  29. {
  30.     int l = Left(i), r = Right(i),largest;   //left,right,largest 
  31.     if (l<=currentSize && arr[l]>arr[i]) largest = l;
  32.     else largest = i;
  33.     if (r<=currentSize && arr[r]>arr[largest]) largest = r;
  34.     if (largest != i)
  35.     {
  36.         Swap(arr[i],arr[largest]);
  37.         MaxHeapify(arr,largest);
  38.     }
  39. }
  40. void MaxHeap::BuildMaxHeap(int* arr,int arrSize)
  41. {
  42.     for (int i=arrSize/2;i>=0;i--)
  43.        MaxHeapify(arr,i);
  44. }
  45. void MaxHeap::HeapSort(int* arr,int arrSize)
  46. {
  47.     BuildMaxHeap(arr,arrSize);
  48.     //一开始我写成for (int i=arrSize/2;i>0;i--),害我对着书画图才发现这个错误,晕.. 
  49.     for (int i=arrSize;i>0;i--)  //最后只有一个元素,不用比较了 
  50.     {
  51.         Swap(arr[0],arr[i]);    //以arr[0]作为最大堆的根 
  52.         currentSize--;          //堆的大小减1 
  53.         MaxHeapify(arr,0); 
  54.     }
  55. }
  56. int main(void)
  57. {
  58.     srand(unsigned(time(NULL)));
  59.     int Size = DefaultSize;
  60.     int *array = new int[Size];
  61.     for(int i=0;i<Size;i++)
  62.         array[i] = rand()%1000;
  63.     cout<<"before sort"<<endl;
  64.     for(int i=0;i<Size;i++)
  65.     {
  66.         cout<<array[i]<<" ";
  67.         if((i+1)%10 == 0)cout<<endl;
  68.     }
  69.     MaxHeap maxHeap(Size-1);   //这里应为Size-1,因为传Size的话就数组越界了.. 
  70.     maxHeap.HeapSort(array,Size-1);
  71.     cout<<endl<<"After sort"<<endl;
  72.     for(int i=0;i<Size;i++)
  73.     {
  74.         cout<<array[i]<<" ";
  75.         if((i+1)%10 == 0)cout<<endl;
  76.     }
  77.     delete [] array;
  78.     return 0;
  79. }
package Heap; public class HeapSort<T extends Comparable<T>> { public static void sort(Comparable[] source){ Comparable[] heap = new Comparable[source.length+1]; createHeap(source,heap); int N=heap.length-1; while(N!=1){ exch(heap,1,N); N--; sink(heap,1,N-1); } } public static void createHeap(Comparable[] source,Comparable[] heap){ System.arraycopy(source, 0, heap, 1, source.length); for(int index=source.length/2;index>=0;index--){ sink(heap,index,source.length-1); } } private static boolean less(Comparable[] heap,int v, int w){ return heap[v].compareTo(heap[w]) < 0; } private static void exch(Comparable[] heap,int v,int w){ Comparable temp=heap[v]; heap[v]=heap[w]; heap[w]=temp; } private static void sink(Comparable[] heap,int target,int range){ int max; while(2*target<=range){ if(2*target+1<=range){ if(less(heap,2*target,2*target+1)){ max=2*target+1; }else{ max=2*target; } }else{ max=2*target; } if(!less(heap,target,max)){ break; } exch(heap,target,max); target=max; } } } package Heap; import java.util.Arrays; public class HeapSortTest { public static void main(String[] args) { String s="YANGDEBIN"; String[] source={"Y","A","N","G","D","E","B","I","N"}; HeapSort<String> hs=new HeapSort(); hs.sort(source); System.out.println(Arrays.toString(source)); } } 为什么报错,报错如下: Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Comparable.compareTo(Object)" because "heap[v]" is null at Heap.HeapSort.less(HeapSort.java:23) at Heap.HeapSort.sink(HeapSort.java:34) at Heap.HeapSort.createHeap(HeapSort.java:19) at Heap.HeapSort.sort(HeapSort.java:6) at Heap.HeapSortTest.main(HeapSortTest.java:11)
最新发布
10-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值