X周

导航

堆、快速排序实现

比较排序:在排序的最终结果中,各元素的次序依赖于它们之间的比较结果。

  1 #include<iostream>
  2 #include<cstdlib>
  3 #include<climits>
  4  
  5  using namespace std;
  6  void exchange(int &a,int &b){
  7       
  8       int temp;
  9       temp = a;
 10       a = b;
 11       b=temp;
 12       cout<<a<<"<->"<<b<<endl;
 13  }
 14  //快速排序 分区函数1 
 15  int Partition1(int a[],int low,int high){
 16  
 17      int x = a[high];
 18     int i = low - 1;
 19     
 20     for(int j=low;j<=high-1;j++){  //i和j从一头变化,low~i保存小于等于X的值,j~high保存大于x的值 
 21         
 22         if(a[j] <= x){
 23             
 24             ++i;
 25             exchange(a[i],a[j]);
 26         }
 27     } 
 28      exchange(a[i+1],a[high]);    
 29     return i+1;
 30  }
 31  //快速排序 分区函数2 
 32  int Partition2(int a[],int low,int high){ //i,j从俩头交替向中间聚拢
 33      int key = a[high]; 
 34     
 35     int i = low;
 36      int j = high;  //
 37      while(i<j){
 38          while(i<j&&a[i]<=key)
 39              ++i;
 40          if(i<j) a[j--]=a[i];
 41          while(i<j&&a[j]>key)
 42              --j;
 43          if(i<j) a[i++]=a[j];
 44      }
 45      a[i] = key;
 46      return i;
 47  }
 48  void QuickSort(int a[],int low,int high){
 49      
 50      int mid;
 51      if(low < high){
 52          mid = Partition2(a,low,high);
 53         QuickSort(a,low,mid-1);    
 54         QuickSort(a,mid+1,high);
 55      }
 56  
 57  } 
 58  
 59  //堆排序
 60 //最大堆化函数0: 递归实现 
 61 void MaxHeapify(int a[],int i,int size){
 62  
 63     int l = 2*i;
 64     int r = 2*i+1; 
 65     int largest = i;
 66     if(l<=size&&a[l]>a[largest])
 67         largest = l;
 68     if(r<=size&&a[r]>a[largest])
 69         largest = r;
 70     if(largest!=i){
 71         
 72         exchange(a[i],a[largest]);
 73         MaxHeapify(a,largest,size);
 74     }    
 75 }
 76 //最大堆化函数1:循环实现 
 77 void MaxHeapify1(int a[],int i,int size){
 78     int l,r,largest;
 79     int index = i;
 80     while(index<=size/2){
 81         
 82         l = 2*index;
 83         r = 2*index+1; 
 84         largest = index;
 85         if(l<=size&&a[l]>a[largest])
 86             largest = l;
 87         if(r<=size&&a[r]>a[largest])
 88             largest = r;
 89         if(index!=largest){
 90             exchange(a[index],a[largest]);
 91             index = largest;
 92          }
 93         else break;    
 94  
 95     }
 96 } 
 97 void BuildMaxHeap(int a[],int low,int high){
 98     int length = high-low+1;
 99     for(int i=length/2;i>=low;--i){
100         MaxHeapify1(a,i,length);
101     } 
102 } 
103 
104 void HeapSort(int a[],int low, int high){
105     BuildMaxHeap(a,low,high);
106     int size =high-low+1;
107     for(int i=high;i>=low;--i){
108     
109         exchange(a[low],a[i]);
110         size=size-1; 
111         MaxHeapify1(a,low,size); 
112     } 
113     
114 }
115  int main(){
116      int num;
117      while(1){    
118          cin>>num;
119          int *array=NULL;
120          array = (int *)malloc(sizeof(int)*(num));
121         
122          for(int i=0;i<num;i++)    cin>>array[i]; 
123         
124          //QuickSort(array,0,num-1);
125          HeapSort(array,0,num-1);
126         
127          for(int i=0;i<num;i++)    cout<<array[i]<<" ";
128      }
129      return 0;
130  }

 

posted on 2013-06-23 16:06  X周  阅读(263)  评论(0)    收藏  举报