【经典题】跟着凡人玩转C语言之快速排序算法

 ?作者:你我皆为凡人

 ?博客主页:你我皆为凡人的博客

 ?名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!

 ?觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!

 ?其他作品:

?[百战成神1]C语言之凡人暴刷小牛【超详细解析,掌握每道题】

?[百战成神2]C语言之凡人暴刷小牛【超详细解析,掌握每道题】

?[百战成神3]C语言之凡人暴刷小牛【超详细解析,掌握每道题】

?[百战成神4]C语言之凡人暴刷小牛【超详细解析,掌握每道题】

?[百战成神5]C语言之凡人暴刷小牛【超详细解析,掌握每道题】

?[百战成神6]C语言之凡人暴刷小牛【超详细解析,掌握每道题】

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5oiR55qG5Li65Yeh5Lq6,size_12,color_FFFFFF,t_70,g_se,x_16

 文章来源地址https://uudwc.com/A/g0aV1

文章目录

目录

文章目录

前言

?C语言三个数从小到大排序/输出

? 问题描述:

?  实现过程:

?代码如下:

?C语言快速排序算法

? 问题描述:

? 快速排序的原理:

?  举例子实现过程:

?代码如下:

总结


前言

内容超详细!!手把手教你如何去解析编程!如果你能听懂C语言,但是一上手就不会了,听完我讲解的题目后,相信你的写代码能力会逐步上升,战胜对编程的恐惧!


提示:以下是本篇文章正文内容,下面案例可供参考

 

?C语言三个数从小到大排序/输出

? 问题描述:

        ✨任意输入 3 个整数,编程实现对这 3 个整数由小到大进行排序。

?  实现过程:

        ✨1,定义三个数,然后输入这三个数

        ✨2,如何实现排序呢,如果三个数的话,a,b,c,让a大于b的话,a和b交换,如果a大于c的话,a和c交换,如果b大于c的话,b和c交换,需要一个中间值来实现交换

        ✨3,最后输出结果,就是从小到大输出的结果

?代码如下:

#include<stdio.h>
int main()
{
	//任意输入三个整数,由小到大进行排序
	int a = 0;
	int b = 0;
	int c = 0;
	int temp = 0; //临时变量
	scanf("%d %d %d", &a, &b, &c);//输入三个数
	if (a > b)//如果第一个数大于第二个
	{
		temp = a;
		a = b;
		b = temp;//把第一个和第二个数交换一下
	}
	if (a > c)//如果第一个大于第三个
	{
		temp = a;
		a = c;
		c = temp;//第一个和第三个交换一下
	}
	if (b > c)//如果第二个大于第三个
	{
		temp = b;
		b = c;
		c = temp;//第二个和第三个交换一下
	}
	printf("%d %d %d", a, b, c);//最后输出的就是  
	return 0;
}

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5oiR55qG5Li65Yeh5Lq6,size_13,color_FFFFFF,t_70,g_se,x_16

?C语言快速排序算法

 

? 问题描述:

        ✨用快速排序法对一组数据由小到大进行排序

? 快速排序的原理:

        ✨在待排序的一串数字中,先找一个数字作为基准数,一般选择第一个数字为基准数

        ✨接下来需要把这个待排序中的数字小于基准数的元素移动到待排序数字的左边,大于基准数的元素移动到待排序数字的右边

        ✨这个时候基准数左右两边就相对有序了,接着把两边的区域在按照以上的方法继续先找出基准数,然后移动,知道找到各个区域只有一个数为止

?  举例子实现过程:

        ✨对{35, 33, 42, 10, 14, 19, 27, 44, 26, 31}进行排序

        ✨将最后一个元素31作为中间元素,将剩余的元素分为两个区域,如下图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5oiR55qG5Li65Yeh5Lq6,size_19,color_FFFFFF,t_70,g_se,x_16

        ✨31之前的都比31小,31之后的都比31大,而两个区域之间的数字还可以再分在比较

        ✨{26,27,19,10,14}看为新的待排序序列,选择14位中间元素,分为{10}与{19,26,27}两个区域,而{10}只有一个,所以不用继续分,然后接着在分{19,26,27}

        ✨{19,26,27}看成新的待排序序列,27为中间元素分为{19,26}与{},接着在分{19,26}

        ✨{19,26}成新的待排序序列,26位中间元素分为{19}与{},最后两个区域都无法再分

        ✨经过以上步骤,最后{26,27,19,10,14}变成了{10,14,19,26,27}成为了一个有序的序列

        ✨重复以上步骤,将{33,44,35,42}看成新的待排序的序列,42为中间元素,分为{33,35}与{44},接着再分{33,44}

        ✨{33,44}看成新的待排序序列,44为中间元素,分为{33}与{},此时两个都无法再分

        ✨经过以上步骤最后{33,44,35,42}变成了{33,35,42,44},成为了有序序列

        ✨最后以上的数字变成了{10,14,19,26,27,33,35,42,44},成为了排好序的序列

         ✨二:理解了排序的实现过程,那么接下来解决的就是如何涉及函数,如何将待排序的序列分成两个子序列,并且同时要保证左边的所有元素要比中间值小,而右边的所有元素要比中间值大呢?

         ✨如果以{35, 33, 42, 10, 14, 19, 27, 44, 26, 31}为例子,选择31为中间元素

         ✨建立两个指针,分别为lo与hi,分别指向第一个元素与倒数第二个元素

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5oiR55qG5Li65Yeh5Lq6,size_19,color_FFFFFF,t_70,g_se,x_16

         ✨当lo像右移动时,指向的35大于中间值时暂停,此时35>31,lo暂时不动

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5oiR55qG5Li65Yeh5Lq6,size_19,color_FFFFFF,t_70,g_se,x_16

         ✨当hi向左移动时,指向的26小于中间值时暂停,此时26<31,hi暂时不动

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5oiR55qG5Li65Yeh5Lq6,size_19,color_FFFFFF,t_70,g_se,x_16

         ✨然后交换lo与hi所指向元素的位置

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5L2g5oiR55qG5Li65Yeh5Lq6,size_19,color_FFFFFF,t_70,g_se,x_16

         ✨重复以上的步骤,直到lo>=hi,将中间值与lo所指向的元素交换位置

         ✨以下以代码方式完成快速排序,注意,思想以代码里的不一定一致,以上只是让大家了解思想

?代码如下:

#include <stdio.h>
int qusort(int arr[], int start, int end)    //自定义函数 qusort()
{
    int i, j;    //定义变量为基本整型
    i = start;    //将每组首个元素赋给i
    j = end;    //将每组末尾元素赋给j
    arr[0] = arr[start];    //设置基准值
    while (i < j)
    {
        while (i < j && arr[0] < arr[j])
            j--;    //位置左移
        if (i < j)
        {
            arr[i] = arr[j];    //将arr[j]放到arr[i]的位置上
            i++;    //位置右移
        }
        while (i < j && arr[i] <= arr[0])
            i++;    //位置左移
        if (i < j)
        {
            arr[j] = arr[i];    //将大于基准值的arr[j]放到arr[i]位置
            j--;    //位置左移
        }
    }
    arr[i] = arr[0];    //将基准值放入指定位置
    if (start < i)
        qusort(arr, start, j - 1);    //对分割出的部分递归调用qusort()函数
    if (i < end)
        qusort(arr, j + 1, end);
    return 0;
}
int main()
{
    int a[11], i;    //定义数组及变量为基本整型
    printf("请输入10个数:\n");
    for (i = 1; i <= 10; i++)
        scanf("%d", &a[i]);    //从键盘中输入10个要进行排序的数
    qusort(a, 1, 10);    //调用qusort()函数进行排序
    printf("排序后的顺序是:\n");
    for (i = 1; i <= 10; i++)
        printf("%5d", a[i]);    //输出排好序的数组
    printf("\n");
    return 0;
}

总结

这系列文章会带大家掌握一些编程的经典题型,逐步分析掌握,把凡人所学的展现给大家,让大家也能看懂,掌握这些题型,以上是凡人今天搞懂的两道题,其中关于快速排序今天才搞,可能以上写的有漏洞什么的,希望大家能够指正,凡人只是小白一个,希望大家指点,以上根据自己的思路与网上的思路总结,方便大家能够看懂,今天又学到不少,加油!!希望大家多多支持
 

fef41c8a8c804a338c3c22816a5eb9c4.gif

 

 

 

 

原文地址:https://blog.csdn.net/weixin_45659943/article/details/124159047

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年08月31日 10:38
下一篇 2023年08月31日 10:41