插入排序和直接选择排序都是稳定的_冒泡排序、选择排序、插入排序

b5c64d1221e476e7e4dcff79b101b5fb.png

排序算法分类

十种常见排序算法可以分为两大类:

  1. 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
  2. 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
f3f692f44e6af3c28540098f8f4ff22b.png

算法复杂度

f10bbef264614d14a2af5d2103dc4ad0.png

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。

不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。

1.冒泡排序(Bubble Sort)

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

1.1 算法描述

一趟:

比较相邻的元素。如果第一个比第二个大,就交换它们两个;

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;

针对所有的元素重复以上的步骤,除了最后一个;

(一趟下来,最大的那个数就排在了最后面,那么下一趟对前n-1个数做同样的操作)

重复步骤1~3,直到排序完成。

1.2 动图演示

黄色表示已排序部分,蓝色表示未排序部分,

00351f9dcbdfa55d4d36da2041415d26.gif

代码实现:

void bubbleSort(int a[], int len){int temp;for (int i=0; i a[j+1]){temp = a[j+1];a[j+1] = a[j];a[j] = temp;}}}}

2.选择排序(Selection Sort)

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

2.1 算法描述

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:

初始状态:无序区为R[1..n],有序区为空;

第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个的新无序区;

n-1趟结束,数组有序化了。

2.2 动图演示

黄色表示已排序部分,蓝色表示未排序部分,红色表示从未排序中选择的最小值

0297887b391d650bddc1ad803651dea8.gif

 代码实现:

void selectSort(int a[], int len){int temp;for (int i=0; i

3、插入排序(Insertion Sort)

插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而变成一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

3.1 算法描述

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

从第一个元素开始,该元素可以认为已经被排序;

取出下一个元素key,在已经排序的元素序列中从后向前扫描;

如果扫描到的元素(已排序)大于新元素key,将扫描到的元素移到下一位置;

重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

将新元素插入到该位置后;

从接下来的n-1个开始

重复步骤2~5。

3.2 动图演示

黄色表示已排序部分,蓝色表示未排序部分,红色表示当前正在处理的key

2cc1eb954cb83d148222cf8015c891fa.gif

代码如下:

void insertSort(int a[], int len){int temp, k;for (int i = 1; i= 0 && temp < a[k])//如果当前的数比temp小,那么就往后移动一位,把位置留给temp{a[k+1] = a[k];k--;//temp再与前面的一位比较}a[k+1] = temp;//上面while循环退出的条件要不然是k=-1,要不就是a[k] < temp,所以这里使a[k+1]}}

今天先写那么多了,未完待续。。。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值