鱼C论坛

 找回密码
 立即注册
查看: 2627|回复: 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

void quick_sort_s_b(int [], int, int);
void quick_sort_b_s(int [], int, int); 


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);
        }
}

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);
        }
        if (right > a)
        {
                quick_sort_b_s(array, a, right);
        }
}



int main()
{
        int length, num;
        printf("请输入要排序几个数字:");
        scanf("%d", &length);
        
        int array1[length];
        for (num = 0; num < length; num++)
        {
                printf("请输入第%d个数字:", num + 1);
                scanf("%d", &array1[num]);
        }
        int array2[length];
        for (num = 0; num < length; num++)
        {
                array2[num] = array1[num];
        }
        
        
        int i;
        
        printf("从小到大为:");
        quick_sort_s_b(array1, 0, length - 1);
        for (i = 0; i < length; i++)
        {
                printf("%d, ", array1[i]);
        }
        
        putchar('\n');
        
        printf("从大到小为:");
        quick_sort_b_s(array2, 0, length -1);
        for (i = 0; i < length; i++)
        {
                printf("%d, ", array2[i]);
        }
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-27 21:48:38 | 显示全部楼层
嗯嗯, 修改了一下, 代码有些繁琐, 请高手指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 03:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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