C语言排序(冒泡排序、选择排序、插入排序和快速排序)

C语言排序(冒泡排序、选择排序、插入排序和快速排序)C语言排序(冒泡排序、选择排序、插入排序和快速排序)C语言排序什么是排序?1.冒泡排序基本思想主要思路:动态示例demo2.选择排序基本思想主要思路动态示例demo3.插入排序基本思想主要思路动态示例demo4.快速排序基本思想主要思路动态示例demoC语言排序什么是排序?就是将无序的变成有序的1.冒泡排序基本思想在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,

大家好,又见面了,我是你们的朋友全栈君。

C语言排序

什么是排序?

就是将无序的变成有序的

1.冒泡排序

基本思想

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。每一趟排序后的效果都是讲没有沉下去的元素给沉下去。

主要思路:

1.比较相邻的元素。如果第一个比第二个大,就交换它们两个。
2.对每一个相邻元素做同样的工作,从开始第一对到结尾的每一对。在这一 点,最后的元素应该会是最大的数。
3.针对多有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较。

demo

#include <stdio.h>

//冒泡排序
void BubbleSort(int arry[],int len)
{ 
   
        int i;
        int j;
        int temp;
        for(i=0;i<len-1;i++)//比较次数
        { 
   
                for(j=0;j<len-1-i;j++)//比较过程
                { 
   
                        if(arry[j]>arry[j+1]) //比较大小
                        { 
   
                                temp=arry[j];
                                arry[j]=arry[j+1];
                                arry[j+1]=temp;

                        }
                }

        }

}
//输出
void print(int arry[],int len)
{ 
   
        int i;
        for(i=0;i<len;i++)
        { 
   
                printf("%d ",arry[i]);
        }
}
int main()
{ 
   

        int arry[10]={ 
   9,3,56,44,77,88,54,79,52,111};

        BubbleSort(arry,10);
        print(arry,10);
        printf("\n");

        return 0;
}

在这里插入图片描述

2.选择排序

基本思想

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

主要思路

每一次从无序组的数据元素中选出最小的一个元素,存放在无序组的起始位置,无需组的元素减少,有序组的元素增加,直到全部待排序的数据元素排完。

demo

#include <stdio.h>

//选择排序
void selectSort(int arry[], int len)
{ 
          int i;
        int j;
        for ( i = 0; i < len-1; i++)
        { 
   
                int min = i;//假设第一个元素是最小的
                for (j = i + 1; j < len; j++)
                { 
   
                        if (arry[j] < arry[min])
                        { 
   
                                min = j;//保存最小元素的下标
                        }
                }
                //交换
                int temp = arry[min];
                arry[min] = arry[i];
                arry[i] = temp;
        }
}
//输出
void print(int arry[], int len)
{ 
   
        for (int i = 0; i < len; i++)
        { 
   
                printf("%d ", arry[i]);
        }
}
int main()
{ 
   
        int arry[10]={ 
   15,36,26,27,24,46,44,29,52,48};
        selectSort(arry,10);
        print(arry,10);


        printf("\n");
        return 0;
}

在这里插入图片描述

3.插入排序

基本思想

将待排序的无序数列看成是一个仅含有一个元素的有序数列和一个无序数列,将无序数列中的元素逐次插入到有序数列中,从而获得最终的有序数列。

主要思路

插入排序是最简单常用的方法,将数组分为两部分,排好序的数列,以及未排序的数列,将未排序的数列中的元素 与排好序的数列进行比较,然后将该元素插入到已排序列的合适位置中。

demo

#include <stdio.h>

//插入排序
void insertSort(int arry[], int len)
{ 
   
        int i;
        int temp;//保存要插入的元素
        int j;//从当前要要比较插入的元素的前面一个开始
        for ( i = 1; i < len; i++)//第一个元素视为有序,把后面的元素一个一个的插入到前面
        { 
   
                temp = arry[i];
                j = i - 1;
                while (j >= 0&&arry[j]>temp)
                { 
   
                        arry[j + 1] = arry[j];//前面的元素往后面移动
                        j--;
                }
                arry[j + 1] = temp;//把要插入的元素,插入进对应的位置
        }
}
//输出
void print(int arry[], int len)
{ 
   
        for (int i = 0; i < len; i++)
        { 
   
                printf("%d ", arry[i]);
        }
}
int main()
{ 
   
        int arry[10]={ 
   3,44,38,5,47,15,36,26,27,2};
        insertSort(arry,10);
        print(arry,10);


        printf("\n");
        return 0;
}

在这里插入图片描述

4.快速排序

基本思想

快速排序算法的基本思想为分治思想。
先从数列中取出一个数作轴值(基准数)pivot;
根据基准数将数列进行分区,小于基准数的放左边,大于基准数的放右边;
重复分区操作,知道各区间只有一个数为止。

主要思路

快速排序是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的值都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n – 1 个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正确位置,排序完成。所以快速排序算法的核心算法是分区操作,及如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

demo

#include <stdio.h>

//快速排序
void quickSort(int arry[], int low, int high)
{ 
   
        if (low > high)
        { 
   
                return;
        }
        int i = low, j = high, temp = arry[i];//获取左右和基准数
        while (i < j)
        { 
   
                while (temp < arry[j] && i < j)
                { 
   
                        j--;
                }
                if (i < j)
                  { 
   
                        arry[i++] = arry[j];
                  }
                while (temp>arry[i] && i < j)
                    { 
   

                        i++;
                     }
                if (i < j)
                    { 
   
                        arry[j--] = arry[i];
                    }
        }
        arry[i] = temp;

        quickSort(arry, low, i - 1);//左边
        quickSort(arry, i + 1, high);//右边
}
//输出
void print(int arry[], int len)
{ 
   
        for (int i = 0; i < len; i++)
        { 
   
                printf("%d ", arry[i]);
        }
}
int main()
{ 
   

        int arry[15]={ 
   7,44,38,99,47,15,36,26,27,2,46,43,19,50,48};
        quickSort(arry,0,14);
        print(arry,15);

        printf("\n");
        return 0;
}        

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153023.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm2020.2永久激活码(JetBrains全家桶)

    (pycharm2020.2永久激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~0E14…

    2022年3月28日
    509
  • vue动态图片地址

    vue动态图片地址

    2020年11月9日
    187
  • springboot项目导入idea中如何部署启动_idea怎么导入javaweb项目

    springboot项目导入idea中如何部署启动_idea怎么导入javaweb项目最近公司要求开发工具要用Idea,作为一个eclipse的老员工,记录一下Idea中遇到的坑刚开始用Idea从Git上导入一个项目时,遇到了很多坑,网上有很多方法,我不多做介绍。只说明一下我使用的方法。1.本地新建一个文件夹,从git上导入项目到本地文件夹。(git的相关使用请自行百度,这里只讲Idea的使用方法)2.将这个文件夹直接拖到Idea的启动图标上。或者,从Ide…

    2022年10月10日
    1
  • 一些蛮好的题目,学习

    一些蛮好的题目,学习

    2022年2月23日
    41
  • 字符指针 赋值

    字符指针 赋值字符串赋值给字符指针(char*a=“hello”)的正确理解方式 对于语句 char*a=”hello”;       对于这个声明方式,会造成的误解是:声明了一个字符指针(它会指向一个位置),将“字符串”赋值给指针表达式”*a”所指向的地址。但正解是:声明了一个字符指针后,并用字符串常量的第一个字符的地址赋值给指针变量a。       即正确顺序是:1.分配

    2022年7月11日
    15
  • 关于爱未删减版高清_init not tainted

    关于爱未删减版高清_init not taintedhttp://blog.csdn.net/wangkaiblog/article/details/8741042http://blog.linux.org.tw/~jserv/archives/001954.html

    2022年8月11日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号