C C++最全排序法 C语言常考的十大排序法 数列、字符的排序_字符排序c语言,2024年最新2024年阿里+腾讯+快手offer都已拿到

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

(1)对数列的排序:

#include <stdio.h>
#define sequence 10//自定义十个元素的数列
int main()
{
    int a[sequence] = {12,43,9,13,67,98,101,89,3,35 };//十个数的无序数列
                                                      //也可以改为用scanf输入
    int i, j, t;
    printf("此程序使用冒泡排序法排列无序数列!\n");
    //冒泡排序
    for (i = 0; i < 10 - 1; i++)//n个数的数列总共扫描n-1次
    {
        for (j = 0; j < 10 - i - 1; j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束
        {
            if (a[j] > a[j + 1])//后一位数比前一位数小的话,就交换两个数的位置(升序)
            {
                t = a[j + 1];
                a[j + 1] = a[j];
                a[j] = t;
            }
        }
    }
    printf("排列好的数列是:\n");
    //输出排列好得吃数列
    for (i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

运行结果如下:

(2)对字符的排序

#include <stdio.h>
#define Character_groups 10//定义了十个字符的字符数组
int main()
{
    char a[Character_groups] = { 'i','l','o','v','e','y','o','u','y','x' };//十个数的无序数列  
   //也可以改用scanf函数输入字符
    int i, j;
    char t;
    printf("此程序使用冒泡排序法排列无序数列!\n");
    //冒泡排序
    for (i = 0; i < 10 - 1; i++)//n个数的数列总共扫描n-1次
    {
        for (j = 0; j < 10 - i - 1; j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束
        {
            if (a[j] > a[j + 1])//后一位数比前一位数小的话,就交换两个数的位置(升序)
            {
                t = a[j + 1];
                a[j + 1] = a[j];
                a[j] = t;
            }
        }
    }
    printf("排列好的字符组是:\n");
    //输出排列好得吃数列
    for (i = 0; i < 10; i++)
    {
        printf("%c ", a[i]);
    }
    return 0;
}

运行结果如下:

对字符串的排序----(自定义函数的方法实现)

#include <stdio.h>

void function(char a[], int m)
{
    //冒泡排序
    int i, j;
    char tmp;
    for (i = 0; i < m - 1; i++)//n个数的数列总共扫描n-1次
    {
        for (j = 0; j < m - i - 1; j++)//每一趟扫描到a[n-i-2]与a[n-i-1]比较为止结束
        {
            if (a[j] > a[j + 1])//后一位数比前一位数小的话,就交换两个数的位置(升序)
            {
                tmp = a[j + 1];
                a[j + 1] = a[j];
                a[j] = tmp;
            }
        }
    }
    return;
}

int main()
{
    void function(char a[], int);//尤其注意,此处的函数声明必须是char a[],因为这里穿的是地址,不能仅仅使用char
    int i;
    char a[10] = { 'i','l','o','v','e','y','o','u','y','x' };//十个数的无序字符数列
    printf("此程序使用冒泡排序法排列无序数列!\n");
    function(a, 10);//调用冒泡排序
    printf("排列好的字符组是:\n");
    //输出排列好得吃数列
    for (i = 0; i < 10; i++)
    {
        printf("%c ", a[i]);
    }
    return 0;
}

运行结果如下:

2.选择排序法

步骤1:初始状态:无序区为R[1…n],有序区为空;
步骤2:第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排              序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使                    R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
步骤3:n-1趟结束,数组有序化了。

选择排序法动画演示

两层for循环实现

#include <stdio.h>

int main()
{
    int i, j, k, n, tmp, a[1000];
    printf("请输入需要排序的数据个数\n");
    scanf("%d",&n);// 从键盘输入待排序的数据个数
    for (i = 0; i < n; i++) 
    { // 利用for循环依次将输入的数据放置在数组中
        scanf("%d",&a[i]);
    }
    for (i = 0; i < n - 1; i++) 
    {// 外层循环 变量i控制排序总共进行n-1轮
        k = i;
        for (j = i + 1; j < n; j++) 
        { //内层循环 变量j控制每轮进行比较的次数
            if (a[j] < a[k])
            {
                k = j;   //k记录每轮比较中的最小者的下标
                if (k != i) 
                { //将第i轮的最小者,与a[i]交换
                    tmp = a[i];
                    a[i] = a[k];
                    a[k] = tmp;
                }
            }
        }
    }
    printf("排序后的数据如下:\n");
    for (i = 0; i < n; i++) { // 利用for循环进行输出
        printf("%d\t", a[i]);
    }
    return 0;
}

运行结果如下:

自定义函数的方法实现

#include<stdio.h>

void SelectSort(int a[], int n) 
{ //选择排序
    int mix, tmp;
    int i, j;
    for (i = 0; i < n - 1; i++) 
    { //每次循环数组,找出最小的元素,放在前面,前面的即为排序好的
        mix = i; //假设最小元素的下标
        for (j = i + 1; j < n; j++) //将上面假设的最小元素与数组比较,交换出最小的元素的下标
            if (a[j] < a[mix])
                mix = j;
        //若数组中真的有比假设的元素还小,则交换
        if (i != mix) 
        {
            tmp = a[i];
            a[i] = a[mix];
            a[mix] = tmp;
        }
    }
}

int main()
{
    int a[10] = { 9,1,5,8,3,7,4,6,2,0 };
    int i;
    SelectSort(a, 10);
    for (i = 0; i < 10; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

运行结果如下:

指针传参方法实现:

#include<stdio.h>
//指针方法实现十个整数的排序
int main()
{
    void sort(int x[], int n);//函数的声明
    int i, * p, a[10];//定义i,*p,数组a
    p = a;//把首元素的地址赋值给指针变量p
    printf("please enter 10 integer numbers:");
    for (i = 0; i < 10; i++)
    {
        scanf("%d", p++);//将从数组的每一个元素的地址都存到内存当中去
    }
    p = a;//再次将指针p指向首元素的地址
    sort(p, 10);//函数的调用

    for (p, i = 0; i < 10; i++)//输出语句    可以写p=a;或者直接写p
    {
        printf("%d ", *p);
        p++;
    }
    printf("\n");
    return 0;
}

void sort(int x[], int n)
{
    int i, j, k, t;
    for (i = 0; i < n - 1; i++)//外层循环控制比较的总趟数  n-1趟
    {
        k = i;//第一次先将下标0对应的元素作为最大元素的下标
        for (j=i+1; j < n ; j++)//内层循环控制每趟比较的总次数
        {
                if (x[j] > x[k])
                {
                    k = j; //k始终保存最大值元素的下标
                }    
        if(k!=i)//如果最大值元素的下标不是最前面的i,则交换元素值
        {
            t = x[i];
            x[i] = x[k];
            x[k] = t;
        }
            }
    }
}
代码运行结果如下:

3.插入排序法

步骤1: 从第一个元素开始,该元素可以认为已经被排序;
步骤2: 取出下一个元素,在已经排序的元素序列中从后向前扫描;
步骤3: 如果该元素(已排序)大于新元素,将该元素移到下一位置;
步骤4: 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
步骤5: 将新元素插入到该位置后;
步骤6: 重复步骤2~5。

插入排序法动画演示

(1)简单方法实现

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

(1)简单方法实现

[外链图片转存中…(img-LX3LUyTt-1715707184289)]
[外链图片转存中…(img-x0Nwfmmy-1715707184289)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值