正文

堆排序与快速排序2007-03-20 11:31:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/24127.html

分享到:

/***********************************************************************\功  能:实现两种排序算法,并比较这两种算法程序首先输出原数组,然后输出经两种算法排序过的数组,并输出排序时间,数组小排序时间都会显示为 0 ms   编译环境:VC ++ 6.0  author:江南孤峰  data: 2006--6--11    \************************************************************************/ #include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <time.h> #define SIZE 100    //数组大小设置 void Exchange(int *a,int *b){   //交换 *a 与 *b int t;  t = *a; *a = *b; *b = t;} void PutOut(int array[]){   //输出排序后的结果 int i,len;  for(i=1,len=array[0]; i<=array[0]; i ++)  printf("%d ",array[i]);} void GetRandArray(int array[],int size){ //获取 size 大小的随机数组 int i;  for(i = 1; i <= size; i ++)  array[i] = rand(); array[0] = size;} /************************** 堆排序 ***********************************/#define PARRENT(i) i>>1    //获取i的父节点#define LEFT(i) i<<1    //获取i的左孩子节点#define RIGHT(i) (i<<1)+1    //获取i的右孩子节点 void KeepHeap(int array[],int i){  //使以 i 为根节点的树保持堆性质 int l,r,big; int len=array[0];   //array[0] 是数组长度  if(i>=array[0])  return; r = RIGHT(i); l = LEFT(i); if(array[l]>array[i] && l <= len)  big = l; else big = i;  if(array[r]>array[big] && r <= len)  big = r; else big = big; if(big != i){  Exchange(&array[big],&array[i]);  KeepHeap(array,big);  //交换后 big 节点可能失去了堆性质 }} void BuildHeap(int array[]){   //对array 中的数建堆 int j;  for(j=array[0]>>1; j>=1; j--)  KeepHeap(array,j);} void HeapInsert(int array[],int key){  //往堆中插入节点 int i;  array[0] ++; i = array[0]; while(i>1 && key > array[PARRENT(i)]){  array[i] = array[PARRENT(i)];  i = PARRENT(i); } array[i] = key;} void HeapSort(int array[]){   //堆排序 int i,save;  BuildHeap(array);    for(save=i=array[0]; array[0]>=2;){  Exchange(&array[1],&array[array[0]]);  array[0] --;   KeepHeap(array,1); } array[0] = save;} /******************************** 快速排序 **********************************/int Partion(int array[],int start,int end){ int i = start - 1; int j = end + 1; int x = array[start];  while(1){  do{    j --;  }while(array[j] > x);  do{   i ++;  }while(array[i] < x);  if(j > i)   Exchange(&array[j],&array[i]);  else   return j; }} void QuickSortA(int array[],int start,int end){ int p;  if(end > start){  p = Partion(array,start,end);  QuickSortA(array,start,p);  QuickSortA(array,p+1,end); }}      int main(){      // 使用两种排序算法,排序同一数组 int array[SIZE+1],save[SIZE+1]; clock_t start,end;  GetRandArray(array,SIZE); memcpy(save,array,sizeof(int)*(SIZE+1)); // copy 数组供两中算法使用 printf("The source array as followed:\n\n"); PutOut(array);  start = clock(); HeapSort(array); end = clock();  printf("\n\n\nHeapSort time is %ld(ms)\n",end - start); PutOut(array);  start = clock(); QuickSortA(save,1,save[0]); end = clock();  printf("\n\n\nQuickSort Time is %ld(ms)\n",end - start); PutOut(save); return 0;}    

阅读(4797) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册