第十六周项目1-(4)验证算法快速排序

问题及代码:

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /*     
  2. * Copyright (c)2016,烟台大学计算机与控制工程学院     
  3. * All rights reserved.     
  4. * 文件名称:项目1.cpp     
  5. * 作    者:朱建豪
  6. * 完成日期:2016年12月29日     
  7. * 版 本 号:v1.0     
  8.      
  9. * 问题描述:验证快速排序     
  10.      
  11. * 输入描述:无     
  12. * 程序输出:测试数据     
  13. */          


(1) 以第一个元素作为基准

代码:

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>    
  2. #define MaxSize 20    
  3. typedef int KeyType;    //定义关键字类型    
  4. typedef char InfoType[10];    
  5. typedef struct          //记录类型    
  6. {    
  7.     KeyType key;        //关键字项    
  8.     InfoType data;      //其他数据项,类型为InfoType    
  9. } RecType;              //排序的记录类型定义    
  10. void QuickSort(RecType R[],int s,int t) //对R[s]至R[t]的元素进行快速排序    
  11. {    
  12.     int i=s,j=t;    
  13.     RecType tmp;    
  14.     if (s<t)                //区间内至少存在两个元素的情况    
  15.     {    
  16.         tmp=R[s];           //用区间的第1个记录作为基准    
  17.         while (i!=j)        //从区间两端交替向中间扫描,直至i=j为止    
  18.         {    
  19.             while (j>i && R[j].key>=tmp.key)    
  20.                 j--;        //从右向左扫描,找第1个小于tmp.key的R[j]    
  21.             R[i]=R[j];      //找到这样的R[j],R[i]"R[j]交换    
  22.             while (i<j && R[i].key<=tmp.key)    
  23.                 i++;        //从左向右扫描,找第1个大于tmp.key的记录R[i]    
  24.             R[j]=R[i];      //找到这样的R[i],R[i]"R[j]交换    
  25.         }    
  26.         R[i]=tmp;    
  27.         QuickSort(R,s,i-1);     //对左区间递归排序    
  28.         QuickSort(R,i+1,t);     //对右区间递归排序    
  29.     }    
  30. }    
  31. int main()    
  32. {    
  33.     int i,n=10;    
  34.     RecType R[MaxSize];    
  35.     KeyType a[]= {6,8,7,9,0,1,3,2,4,5};    
  36.     for (i=0; i<n; i++)    
  37.         R[i].key=a[i];    
  38.     printf("排序前:");    
  39.     for (i=0; i<n; i++)    
  40.         printf("%d ",R[i].key);    
  41.     printf("\n");    
  42.     QuickSort(R,0,n-1);    
  43.     printf("排序后:");    
  44.     for (i=0; i<n; i++)    
  45.         printf("%d ",R[i].key);    
  46.     printf("\n");    
  47.     return 0;    
  48. }    
运行结果:


(2)以中间元素作为基准

代码:

[cpp]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>      
  2. #define MaxSize 20      
  3. typedef int KeyType;    //定义关键字类型      
  4. typedef char InfoType[10];      
  5. typedef struct          //记录类型      
  6. {      
  7.     KeyType key;        //关键字项      
  8.     InfoType data;      //其他数据项,类型为InfoType      
  9. } RecType;              //排序的记录类型定义      
  10. void QuickSort1(RecType R[],int s,int t) //对R[s]至R[t]的元素进行快速排序      
  11. {      
  12.     int i=s,j=t;      
  13.     KeyType pivot;      
  14.     RecType tmp;      
  15.     pivot = R[(s+t)/2].key; //用区间的中间位置的元素作为关键字      
  16.     if (s<t)                //区间内至少存在两个元素的情况      
  17.     {      
  18.         while (i!=j)        //从区间两端交替向中间扫描,直至i=j为止      
  19.         {      
  20.             while (j>i && R[j].key>pivot)      
  21.                 j--;        //从右向左扫描,找第1个小于基准的R[j]      
  22.             while (i<j && R[i].key<pivot)      
  23.                 i++;        //从左向右扫描,找第1个大于基准记录R[i]      
  24.             if(i<j)        //将前后的两个失序元素进行交换      
  25.             {      
  26.                 tmp=R[i];      
  27.                 R[i]=R[j];      
  28.                 R[j]=tmp;      
  29.             }      
  30.         }      
  31.         QuickSort1(R,s,i-1);        //对左区间递归排序      
  32.         QuickSort1(R,j+1,t);        //对右区间递归排序      
  33.     }      
  34. }      
  35. int main()      
  36. {      
  37.     int i,n=10;      
  38.     RecType R[MaxSize];      
  39.     KeyType a[]= {6,8,7,9,0,1,3,2,4,5};      
  40.     for (i=0; i<n; i++)      
  41.         R[i].key=a[i];      
  42.     printf("排序前:");      
  43.     for (i=0; i<n; i++)      
  44.         printf("%d ",R[i].key);      
  45.     printf("\n");      
  46.     QuickSort1(R,0,n-1);      
  47.     printf("排序后:");      
  48.     for (i=0; i<n; i++)      
  49.         printf("%d ",R[i].key);      
  50.     printf("\n");      
  51.     return 0;      
  52. }      

运行结果:

知识点总结:

快速排序是排序速度最快的一种算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值