几种排序算法的实现

欢迎访问本人博客!http://blog.csdn.net/ktb2007

 //
 /**//*利用随机函数产生N个随机整数(2000以上),对这些数进行多种方法进行排序。

 要求:

 至少采用三种方法实现(提示,可采用插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。
 并把排序后的结果保存在不同的文件中。

 统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。*/
 /**/
 //distracb:
 // 几种排序方法的实现


 #include<stdio.h>
 #include<time.h>
 #include<stdlib.h>

 #define MAXSIZE 100
 // const int MAXSIZE = 20 ;

 //定义数据结构

 typedef int KeyType;
 typedef char InfoType;

 typedef struct{
 KeyType key;
 InfoType otherinfo;
 }RcdType; //记录类型

 typedef struct{
 RcdType r[MAXSIZE+1];
 int length;
 }SqList;

 typedef SqList HeapType; //堆采用顺序表存储结构表示

 //函数声明部分
 //(注意声明部分要加返回类型)
 bool LT(KeyType a ,KeyType b); //比较两个关键字大小的函数
 void InsertSort(SqList L); //直接插入排序
 void BInsertSort(SqList L); //折半插入排序
 void BubbleSort(SqList L); //冒泡排序
 void QuickSort(SqList L); //快速排序
 void ShellSort(SqList L); //希尔排序

 /**///
 bool LT(KeyType a ,KeyType b)
 {
 if(a <= b) return true;
 else return false;
 }
 /**//*
 //直接插入排序
 void InsertSort(SqList L)
 {
 for(int i=2;i<=L.length;i++)
 if(LT(L.r[i].key,L.r[i-1].key))
 {
 L.r[0]=L.r[i]; //复制为哨兵
 L.r[i]=L.r[i-1];
 for(int j=i-2;LT(L.r[0].key,L.r[j].key);j--)
 L.r[j+1]=L.r[j]; //记录后移
 L.r[j+1]=L.r[0]; //插入到正确位置
 }
 printf("after insertsort the recodelist is : ");
 for(i=1;i<=L.length;i++)
 printf("%d ",L.r[i].key);
 }


 //折半插入排序
 void BInsertSort(SqList L)
 {
 for(int i=2;i<=L.length;i++)
 {
 L.r[0]=L.r[i];
 L.r[i]=L.r[i-1];
 int low=0,high=i-1;
 while(low<high) //寻找插入位置
 {
 int m=(low+high)/2;
 if(LT(L.r[0].key,L.r[m].key))
 high=m-1;
 else low=m+1;
 }
 for(int j=i-1;j>=high+1;j--)
 L.r[j+1]=L.r[j]; //记录后移
 L.r[high+1]=L.r[0]; //插入记录
 }
 printf("after Binary insertsort the recodelist is : ");
 for(i=1;i<=L.length;i++)
 printf("%d ",L.r[i].key);
 }


 //希尔排序
 void ShellInsert(SqList L ,int dk ) //一趟希尔插入排序
 {
 for(int i=dk+1;i<=L.length;i++)
 if(LT(L.r[i].key,L.r[i-dk].key))
 {
 L.r[0]=L.r[i];
 for(int j=i-dk;(j>0) && LT(L.r[0].key,L.r[j].key);j-=dk)
 L.r[j+dk]=L.r[j];
 L.r[j+dk]=L.r[0];
 }
 }

 int dlta[]={8,4,2,1}; //增量序列dlta[k]=2^(t-k-1) t为排序趟数4
 int t=4;
 void ShellSort(SqList L ,int dlta[],int t )
 {
 for(int k=0;k<t;k++)
 ShellInsert( L ,dlta[k] );

 printf("after ShellSort the recodelist is : ");
 for(int i=1;i<=L.length;i++)
 printf("%d ",L.r[i].key);
 }


 //冒泡排序
 void BubbleSort(SqList L)
 {
 int flag=1;
 for(int i=1;i<=L.length && flag!=0;i++)
 {
 flag=0;
 for(int j=1;j<=(L.length-i);j++)
 if(LT(L.r[j].key,L.r[j+1].key))
 {
 RcdType temp = L.r[j];
 L.r[j] = L.r[j+1];
 L.r[j+1] = temp;
 flag=1;
 }
 }
 printf("after BubbleSort the recodelist is : ");
 for(i=1;i<=L.length;i++)
 printf("%d ",L.r[i].key);
 }


 //快速排序
 int Partition(SqList L,int low ,int high) //一次划分
 {
 L.r[0] = L.r[low];
 KeyType pivotkey = L.r[low].key; //第一个记录作为枢轴记录
 while(low<high)
 {
 while((low < high) && LT(pivotkey,L.r[high].key))
 --high;
 L.r[low] = L.r[high];
 while(low<high && LT(L.r[low].key , pivotkey )) 
 ++low;
 L.r[high] = L.r[low];
 }
 L.r[low]=L.r[0]; //枢轴记录到位
 return low; //返回枢轴位置
 }

 void Qsort(SqList L,int low,int high)
 {
 if(low<high)
 {
 int pivotkey = Partition(L,low,high);
 Qsort(L,pivotkey+1 ,high);
 Qsort(L,low,pivotkey-1);
 }

 }

 void QuickSort(SqList L)
 {
 Qsort( L, 1, L.length);
 printf("after QuickSort the recodelist is : ");
 for(int i=1;i<=L.length;i++)
 printf("%d ",L.r[i].key);
 }


 //简单选择排序
 SelectMinKey(SqList,int); //声明

 void SelectSort(SqList L)
 { 
 for(int i=1;i<L.length;i++)
 {
 int j = SelectMinKey(L,i); //在L.r[i....L.length]中选择一个最小的记录
 if(i!=j) //交换记录
 {
 RcdType temp = L.r[j];
 L.r[j] = L.r[i];
 L.r[i] = temp;
 }
 }
 printf("after SelectSort the recodelist is : ");
 for(i=1;i<=L.length;i++)
 printf("%d ",L.r[i].key);
 }

 int SelectMinKey(SqList L,int i) //寻找记录中最小值的位置
 {
 KeyType k;
 int position;
 k = L.r[i].key;
 for(;i<=L.length;i++)
 {
 if(LT(L.r[i].key,k))
 {
 k = L.r[i].key;
 position=i;
 }
 }
 return position;
 }

 //堆排序


 void HeapAdjust(HeapType H, int s ,int m) //堆调整函数(筛选)
 //已知H.r[s...m]中记录的关键字除H.r[s].key 之外均满足堆的定义,本函数调整H.r[s]的关键字
 //使H.r[s....m]成为一个大顶堆(对其中的关键字而言)
 {
 RcdType rc = H.r[s]; //现在的顶部结点
 for(int j=2*s;j<=m;j*=2) //沿key 较大的孩子结点像下筛选
 {
 if(j<m && LT(H.r[j].key,H.r[j+1].key)) ++j; //j为较大记录的下标
 if(!LT(rc.key,H.r[j].key)) break; //rc应插入在位置s上
 H.r[s]=H.r[j];
 s=j;
 }
 H.r[s]=rc; //插入
 }

 void HeapSort(HeapType H) //堆排序
 {
 for(int i=H.length/2; i>0;i--) //把H.r[1...L.length]建成大顶堆
 HeapAdjust( H, 1 ,H.length);
 for(i=H.length;i>1;i--)
 {
 RcdType temp = H.r[1]; //将堆顶记录和子序列H.r[1...i]中的最后一个记录交换
 H.r[1]=H.r[i];
 H.r[i]=temp;
 HeapAdjust(H, 1 ,i-1); //重新调整为大顶堆
 }
 printf("after HeapSort the recodelist is : ");
 for(i=1;i<=H.length;i++)
 printf("%d ",H.r[i].key);
 }

 */
 //2-路归并排序
 void Merge(RcdType SR[],RcdType TR[],int i,int m,int n) /**//????RcdType &TR[]为什么就提示好多错误??
 //将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
 {
 for(int k=i,j=m+1;(i<=m) && (j<=n);++k) //将SR中的记录由小到大的并入到TR
 ...{
 if(LT(SR[i].key,SR[j].key))
 TR[k]= SR[i++];
 else TR[k]=SR[j++];
 }
 if(i<=m)
 ...{ 
 for(;i<=m;i++,k++)
 TR[k]=SR[i];
 }
 if(j<=n)
 ...{
 for(;j<=n;j++,k++)
 TR[k]=SR[j];
 }
 }

 void MSort(RcdType SR[],RcdType TR1[],int s,int t)
 //将SR[s..t]归并排序为TR1[s..t]
 {
 RcdType TR2[20]; /**????????????????????这里应该定义数组多大呢 、?
 if(s == t) TR1[s]=SR[s];
 else...{
 int m=(s+t)/2; //将SR平分成两部分
 MSort(SR,TR2,s,m); //递归地将SR[s..m]归并为有序的TR2[s.m]
 MSort(SR,TR2,m+1,t); //递归地将SR[m+1..t]归并为有序的TR2[m+1..t]
 Merge(TR2,TR1,s,m,t); //将TR2[s.m] TR2[m+1..t]归并到 TR1[s..m]
 }
 }

 void MerqeSort(SqList L)
 {
 MSort(L.r,L.r,1,L.length);
 printf("after MerqeSort the recodelist is : ");
 for(int i=1;i<=L.length;i++)
 printf("%d ",L.r[i].key);
 }

 void menu()
 {
 printf(" *************************** ");
 printf(" 1: Insert Sort ");
 printf(" 2: BInsert Sort ");
 printf(" 3: Bubble Sort ");
 printf(" 4: Quick Sort ");
 printf(" 5: Straight Selection Sort ");
 printf(" 6: Heap Sort ");
 printf(" 7: Merge Sort ");
 printf(" 8: Exit ");
 printf(" *************************** ");
 }

 //主函数
 void main()
 {
 SqList L;
 srand(10);
 for(int i=1;i<=MAXSIZE;i++)
 L.r[i].key=rand()+2000;
 L.length=MAXSIZE;

 menu();
 clock_t start, finish; 
 double duration; 
 /**//* double duration[8]; 
 int count=0;

 start = clock(); 
 InsertSort( L);
 finish = clock(); 
 duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
 printf( "InsertSort cost time %f seconds: ", duration[count] ); 
 count++;
 system("pause"); 

 start = clock(); 
 BInsertSort( L);
 finish = clock(); 
 duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
 printf( "BInsertSort cost time %f seconds: ", duration[count] ); 
 count++;
 system("pause"); 

 start = clock();
 ShellSort( L ,dlta,4 );
 finish = clock(); 
 duration[count]= (double)(finish - start) / CLOCKS_PER_SEC; 
 printf( "ShellInsert cost time %f seconds: ", duration[count] ); 
 count++;
 system("pause"); 

 start = clock();
 BubbleSort( L);
 finish = clock(); 
 duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
 printf( "BubbleSort cost time %f seconds: ", duration[count] ); 
 count++;
 system("pause"); 

 start = clock();
 QuickSort( L);
 finish = clock(); 
 duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
 printf( "QuickSort cost time %f seconds: ", duration[count] ); 
 count++;
 system("pause"); 

 start = clock();
 SelectSort(L);
 finish = clock(); 
 duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
 printf( "SelectSort cost time %f seconds: ", duration[count] ); 
 count++;
 system("pause"); 

 start = clock();
 HeapSort( L);
 finish = clock(); 
 duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
 printf( "HeapSort cost time %f seconds: ", duration[count] ); 
 count++;
 system("pause"); 
 */ 
 start = clock();
 MerqeSort( L);
 finish = clock(); 
 // duration[count] = (double)(finish - start) / CLOCKS_PER_SEC; 
 // printf( "MerqeSort cost time %f seconds: ", duration[count] ); 
 //count++;
 duration = (double)(finish - start) / CLOCKS_PER_SEC; 
 printf( "MerqeSort cost time %f seconds: ", duration ); 
 system("pause"); 

 /**//* printf("compare the cost time here : ");
 for(count=0;count<8;count++)
 {
 printf( "T%d cost time %f seconds: ", count+1,duration[count] );
 }
 */ 
 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值