鱼C论坛

 找回密码
 立即注册
查看: 7994|回复: 22

[扩展阅读] 各种各这样的排序算法:快速排序

[复制链接]
发表于 2016-12-8 17:37:49 | 显示全部楼层 |阅读模式
购买主题 已有 12 人购买  本主题需向作者支付 10 鱼币 才能浏览
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-8 19:55:25 | 显示全部楼层
不明觉厉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-9 08:41:23 | 显示全部楼层
我有点看不懂排序到中间的时候那个基准元素是变了吗还是怎样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-27 14:03:28 From FishC Mobile | 显示全部楼层
稳定性是什么意思啊

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-11 14:36:41 | 显示全部楼层
很棒棒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-20 10:03:14 | 显示全部楼层
其它8种排序算法的标题最后都打了一个指针符,唯独这个快速排序算法没有,小甲鱼老师莫非是在暗示我们什么吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2019-2-11 13:34:46 | 显示全部楼层
快速排序是最常用的,必须掌握
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-15 21:53:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-2 13:02:46 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-12 22:51:16 | 显示全部楼层
麻了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-26 00:09:40 | 显示全部楼层
小甲鱼🐟🐟,快速排序不是应该每一趟将基准移动到最终位置上么,那个7没到最终位置啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 10:10:38 | 显示全部楼层
  1. #include<stdio.h>

  2. void qick(int a[],int left,int right)
  3. {
  4.         int i = 0,j = 0,tem,p;
  5.         i = left;
  6.         j = right;
  7.         p = a[(i + j) / 2];
  8.         while(i < j)
  9.         {
  10.                 while(a[i] < p)
  11.                 i++;
  12.                 while(a[j] > p)
  13.                 j--;
  14.                 if(i <= j)
  15.                 {
  16.                         tem = a[i];
  17.                         a[i] = a[j];
  18.                         a[j] = tem;
  19.                         i++;
  20.                         j--;
  21.                 }
  22.         }
  23.         if(left < j)
  24.         qick(a,left,j);
  25.         if(right > i)
  26.         qick(a,i,right);
  27. }
  28. int main(void)
  29. {
  30.         int i,len;
  31.         int array[] = {73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109};
  32.         len = sizeof(array) / sizeof(array[0]);
  33.         qick(array,0,len - 1);
  34.         for(i = 0;i < len;i ++)
  35.         {
  36.                 printf("%d ",array[i]);
  37.         }
  38.         return 0;
  39. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2020-5-31 11:30:25 | 显示全部楼层
if(i <= j)
                {
                        tem = a[i];
                        a[i] = a[j];
                        a[j] = tem;
                        i++;//有啥用啊
                        j--;//这两行
                }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-27 15:46:25 From FishC Mobile | 显示全部楼层
left  right 的值是咋弄的,没定义,直接是按数组里元素的个数算的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-4 10:54:57 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-11 09:48:10 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-11 02:01:49 | 显示全部楼层
  1. #include<stdio.h>

  2. void quick_sort(int s[], int l, int r)
  3. {
  4.         if (l < r)
  5.         {
  6.                 //x作为工具值,最左边的第一个值有坑位
  7.                 int i = l, j = r, x = s[l];
  8.                 // 根据工具值,区分左右半区,左边小,右边大
  9.                 while (i < j)
  10.                 {
  11.                         //工具值取左, 就从右边开始运算
  12.                         while (x <= s[j] && i < j)
  13.                         {
  14.                                 j--;
  15.                         }
  16.                         //右边比工具值小才会跳出循环,把这个小的值给左边的坑位
  17.                         s[i] = s[j];
  18.                         while (x >= s[i] && i < j)
  19.                         {
  20.                                 i++;
  21.                         }
  22.                         //左边比工具值大才会跳出循环,把这个大的值给刚刚被挖的右边的坑位
  23.                         s[j] = s[i];
  24.                 }
  25.                 //中间的坑位,让工具值x填进去
  26.                 s[i] = x;

  27.                 //同理
  28.                 quick_sort(s, l, i - 1);
  29.                 quick_sort(s, i + 1, r);
  30.         }
  31. }
  32. int main()
  33. {
  34.         int s[] = { 1,5,7,3,9,8,0,2 };
  35.         int length;
  36.         length = sizeof(s) / sizeof(s[0]);
  37.         quick_sort(s, 0, length - 1);
  38.         for (int i = 0; i < length; i++)
  39.         {
  40.                 printf("%-2d", s[i]);
  41.         }
  42.         printf("\n");

  43.         return 0;
  44. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 22:55:25 | 显示全部楼层

就是如果执行if语句里的东西了,i和j就不会移动了之所以要加上i++和j--,因为那两个while语句中有移动的语句,就是两个while都不执行,才会执行if语句,我也是刚懂,可能没说明白。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-7 21:38:48 | 显示全部楼层
递归真的对于我这种小白太难了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-13 13:01:28 | 显示全部楼层
那个if里面的是什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 21:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表