ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言快排

2020-03-24 21:02:42  阅读:224  来源: 互联网

标签:right temp 快排 基准 C语言 索引 left


  1 /*
  2     Tue Mar 24 20:07:26 2020
  3 
  4     目的:快速排序
  5     结论:快排真难,算法头秃 
  6     功能:首先取数组首端元素为基准数(temp),先从右往左依次比较出首个
  7     比基准数小的元素,再从左往右依次比较出首个比基准数大的元素,两者
  8     互换,重复以上操作,注意先右后左,直到i=j,a[i]与基准数互换
  9     
 10     形成新的序列,左边为小于基准数序列,右边为大于基准数序列。
 11      
 12     此时从左侧序列开始重复以上操作,直到左侧序列为升序排列,
 13     再从右侧序列开始重复以上操作 ,直到右侧序列为升序排列。 
 14     左右先后无影响
 15     
 16     程序结束 
 17 */
 18 #include<stdio.h>
 19 //n:获取数组内容的实际大小 
 20  
 21 int a[101],n;
 22 
 23 void quicksort(int left ,int right ) //left数组的首端索引,right数组的尾端索引 
 24 {
 25     /*
 26         i: 快排每段分治时的首端索引
 27         j: 快排每段分治时的尾端索引
 28         temp:基准数 
 29     */ 
 30     int i, j, t, temp;
 31     
 32     /*
 33         这段代码漏了,会导致程序执行到递归时,right不断自减为0,
 34         left不变一直为1,left>right,i与j不会变化,
 35         程序死循环,无法快排 。 
 36     */
 37     if(left > right)//首端索引大于尾端索引,快排无法进行 
 38         return;
 39     
 40     //赋值
 41      
 42     temp = a[left];
 43     i = left;
 44     j = right;
 45 
 46     /*
 47         数组索引j为找到比基准数小的值判断a[j]是否大于temp
 48         是则递减直到找到a[j]小于基准数。
 49         数组索引i为找到比基准数大的值判断a[i]是否小于temp
 50         是则递增直到找到a[i]大于基准数。        
 51     */
 52     while(i != j) {
 53         
 54         while(a[j] >= temp && i < j)
 55         {
 56             j--;
 57         }
 58         while(a[i] <= temp && i<j )
 59         {
 60             i++;
 61         }
 62         /*
 63         这样写看似符合快排逻辑,实际上结果是将大数往前排
 64         '小数'往后排,是倒序快排,大的往左放,小的往右放。 
 65         while(a[j] <= temp && i < j) {
 66             j--;
 67         }
 68         while(a[i] >= temp && i<j ) {
 69             i++;
 70         }
 71         */
 72         
 73         // 
 74         if(i < j) {
 75             t = a[i];
 76             a[i] = a[j];
 77             a[j]= t;
 78         }
 79     }
 80     //重调基准数 
 81     a[left] = a[i];//确定新的基准数 
 82     a[i] = temp;//将前一个基准数置中于序列 
 83     /*temp=a[i];
 84       temp的值由a[left]确立
 85       这样写会导致中间序列数无法确认    
 86     */
 87     
 88      /*
 89          左侧序列快排及右侧序列快排
 90         先后顺序对结果无影响 
 91      */ 
 92     quicksort(i+1,right);
 93     quicksort(left,i-1);
 94     
 95 }
 96 int main () {
 97     /*
 98         i:控制数组输入输出的次数
 99         n:数组实际长度 
100     */ 
101     int i;
102 
103     scanf("%d",&n);
104     for(i = 1; i <= n; i++) {
105         scanf("%d",&a[i]);
106     }
107 
108     quicksort(1,n);
109 
110     for(i = 1; i <= n; i++) {
111         printf("%d",a[i]);
112     }
113     return 0;
114 }

参考链接:https://blog.csdn.net/vayne_xiao/article/details/53508973?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

标签:right,temp,快排,基准,C语言,索引,left
来源: https://www.cnblogs.com/MoMei25/p/12561876.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有