c语言十大经典算法排序,十大经典排序算法,作为程序员一定要知道!(详细解析)...

十大排序算法可以说是每个程序员都必须得掌握的了,花了一天的时间把代码实现且整理了一下,为了方便大家学习,我把它整理成一篇文章,每种算法会有简单的算法思想描述,为了方便大家理解,我还找来了动图演示;这还不够,我还附上了对应的优质文章,看完不懂你来砍我,如果不想砍我就给我来个好看。

术语铺垫

有些人可能不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下:

1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。

2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。

3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。

4、非原地排序:需要利用额外的数组来辅助排序。

5、时间复杂度:一个算法执行所消耗的时间。

6、空间复杂度:运行完一个算法所需的内存大小。

十大排序讲解顺序

为了方便大家查找,我这里弄一个伪目录,没有跳转功能。

选择排序

插入排序

冒泡排序

非优化版本

优化版本

希尔排序

归并排序

递归式归并排序

非递归式归并排序

快速排序

堆排序

基数排序

非优化版本

优化版本

桶排序

基数排序

1、选择排序

过程简单描述:

首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法我们称之为选择排序。

为方便理解我还准备了动图:

02cfa6ba743ccb340061814a3ba70499.png

代码如下(代码片可以左右拉动,下同):

int* selectSort(int a[],int n)

{

for (int i = 0; i < n - 1; i++)

{

int min = i;

for (int j = i + 1; j < n; j++)

{

if (a[min] > a[j]) min = j;

}

//交换

int temp = a[i];

a[i] = a[min];

a[min] = temp;

}

return a;

}

性质:1、时间复杂度:O(n2) 2、空间复杂度:O(1) 3、非稳定排序 4、原地排序

其实做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C语言C++交流Q群479478422,不管你是小白还是大牛欢迎入驻,大家一起交流成长。

2、插入排序

我们在玩打牌的时候,你是怎么整理那些牌的呢?一种简单的方法就是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置。当我们给无序数组做排序的时候,为了要插入元素,我们需要腾出空间,将其余所有元素在插入之前都向右移动一位,这种算法我们称之为插入排序。

过程简单描述:

1、从数组第2个元素开始抽取元素。

2、把它与左边第一个元素比较,如果左边第一个元素比它大,则继续与左边第二个元素比较下去,直到遇到不比它大的元素,然后插到这个元素的右边。

3、继续选取第3,4,….n个元素,重复步骤 2 ,选择适当的位置插入。

a17a9e7d3d20761eddfc0ddc63b07ace.png

代码如下:

int* insertSort(int arr[] ,int n)

{

if (arr == NULL || n < 2)

{

return arr;

}

for (int i = 1; i < n; i++) {

int temp = arr[i];

int k = i - 1;

while (k >= 0 && arr[k] > temp)

k--;

//腾出位置插进去,要插的位置是 k + 1;

for (int j = i; j > k + 1; j--)

arr[j] = arr[j - 1];

//插进去

arr[k + 1] = temp;

}

return arr;

}

性质:1、时间复杂度:O(n2) 2、空间复杂度&

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值