鱼C论坛

 找回密码
 立即注册
查看: 2880|回复: 2

[学习笔记] 哈哈, 新手的快速排序

[复制链接]
发表于 2020-9-26 21:09:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
void quick_sort_b_s(int [], int, int);//从大到小
void quick_sort_s_b(int [], int, int);//从小到大

void quick_sort_b_s(int array[], int left, int right)
{
        int a = left, b = right, c;
        int p_point = array[(a + b) / 2];//设置基准点
       
        while (a <= b)
        {
                //找到小于基准点的数
                while (array[a] > p_point)
                {
                        a++;
                }
                //找到大于基准点的数
                while (array[b] < p_point)
                {
                        b--;
                }
                //将两者互换
                if (a <= b)
                {
                        c = array[a];
                        array[a] = array[b];
                        array[b] = c;
                        a++;
                        b--;
                }
        }
        //分成两组排序
        if (left < b)//
        {
                quick_sort_b_s(array, left, b);//因为将两者互换了位置, 所以array[a], array[b]互换了位置, array[b]较大
    }
        if (a < right)
        {
                quick_sort_b_s(array, a, right);
        }
}

void quick_sort_s_b(int array[], int left, int right)
{
        int a = left, b = right, c;
        int p_point = array[(a + b) / 2];//设置基准点!
       
        while (a <= b)
        {
                //从左往右找大于等于基准点的数
                while (array[a] < p_point)
                {
                        a++;
                }
                //从右向左找小于等于基准点得数
                while (array[b] > p_point)
                {
                        b--;
                }
                //将两数互换
                if (a <= b)//必须设置, 从而将大数往后排!
                {
                        c = array[a];
                        array[a] = array[b];
                        array[b] = c;
                        //要达成语句结束条件!
                        a++;
                        b--;
                }
        }
        //分成两部分递归!
        if (left < b)
        {
                quick_sort_s_b(array, left, b);
        }
        if (right > a)
        {
                quick_sort_s_b(array, a, right);
        }
}



int main(void)
{
        int array[] = {1, 9, 7, 76, 8, 87, 58, 5, 59, 45, 0, 87, 57, -199};//定义数组  
        int length = sizeof(array) / sizeof(array[0]);//计算有几个数字
        int left = 0, right = length - 1;
       
        quick_sort_s_b(array, left, right);
       
        int i;
        for (i = 0; i < length; i++)
        {
                printf("%d ", array[i]);
        }
       
        printf("\n");
       
        quick_sort_b_s(array, left, right);
        for (i = 0; i < length; i++)
        {
                printf("%d ", array[i]);
        }
       
        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-27 21:47:38 | 显示全部楼层
  1. #include <stdio.h>

  2. void quick_sort_s_b(int [], int, int);
  3. void quick_sort_b_s(int [], int, int);


  4. void quick_sort_s_b(int array[], int left, int right)
  5. {
  6.         int a = left, b = right, c;
  7.         int p_point = array[(a + b) / 2];//设置基准点!
  8.        
  9.         while (a <= b)
  10.         {
  11.                 //从左往右找大于等于基准点的数
  12.                 while (array[a] < p_point)
  13.                 {
  14.                         a++;
  15.                 }
  16.                 //从右向左找小于等于基准点得数
  17.                 while (array[b] > p_point)
  18.                 {
  19.                         b--;
  20.                 }
  21.                 //将两数互换
  22.                 if (a <= b)//必须设置, 从而将大数往后排!
  23.                 {
  24.                         c = array[a];
  25.                         array[a] = array[b];
  26.                         array[b] = c;
  27.                         //要达成语句结束条件!
  28.                         a++;
  29.                         b--;
  30.                 }
  31.         }
  32.         //分成两部分递归!
  33.         if (left < b)
  34.         {
  35.             quick_sort_s_b(array, left, b);
  36.         }
  37.         if (right > a)
  38.         {
  39.                 quick_sort_s_b(array, a, right);
  40.         }
  41. }

  42. void quick_sort_b_s(int array[], int left, int right)
  43. {
  44.         int a = left, b = right, c;
  45.         int p_point = array[(a + b) / 2];//设置基准点!
  46.        
  47.         while (a <= b)
  48.         {
  49.                 //从左往右找小于等于基准点的数
  50.                 while (array[a] > p_point)
  51.                 {
  52.                         a++;
  53.                 }
  54.                 //从右向左找大于等于基准点得数
  55.                 while (array[b] < p_point)
  56.                 {
  57.                         b--;
  58.                 }
  59.                 //将两数互换
  60.                 if (a <= b)//必须设置, 从而将大数往后排!
  61.                 {
  62.                         c = array[a];
  63.                         array[a] = array[b];
  64.                         array[b] = c;
  65.                         //要达成语句结束条件!
  66.                         a++;
  67.                         b--;
  68.                 }
  69.         }
  70.         //分成两部分递归!
  71.         if (left < b)
  72.         {
  73.                 quick_sort_b_s(array, left, b);
  74.         }
  75.         if (right > a)
  76.         {
  77.                 quick_sort_b_s(array, a, right);
  78.         }
  79. }



  80. int main()
  81. {
  82.         int length, num;
  83.         printf("请输入要排序几个数字:");
  84.         scanf("%d", &length);
  85.        
  86.         int array1[length];
  87.         for (num = 0; num < length; num++)
  88.         {
  89.                 printf("请输入第%d个数字:", num + 1);
  90.                 scanf("%d", &array1[num]);
  91.         }
  92.         int array2[length];
  93.         for (num = 0; num < length; num++)
  94.         {
  95.                 array2[num] = array1[num];
  96.         }
  97.        
  98.        
  99.         int i;
  100.        
  101.         printf("从小到大为:");
  102.         quick_sort_s_b(array1, 0, length - 1);
  103.         for (i = 0; i < length; i++)
  104.         {
  105.                 printf("%d, ", array1[i]);
  106.         }
  107.        
  108.         putchar('\n');
  109.        
  110.         printf("从大到小为:");
  111.         quick_sort_b_s(array2, 0, length -1);
  112.         for (i = 0; i < length; i++)
  113.         {
  114.                 printf("%d, ", array2[i]);
  115.         }
  116.        
  117.         return 0;
  118. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-27 21:48:38 | 显示全部楼层
嗯嗯, 修改了一下, 代码有些繁琐, 请高手指教
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 18:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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