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

插入排序和直接选择排序都是稳定的_冒泡排序、选择排序、插入排序_第1张图片

排序算法分类

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

  1. 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
  2. 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
插入排序和直接选择排序都是稳定的_冒泡排序、选择排序、插入排序_第2张图片

算法复杂度

插入排序和直接选择排序都是稳定的_冒泡排序、选择排序、插入排序_第3张图片

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

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

1.冒泡排序(Bubble Sort)

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

1.1 算法描述

一趟:

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

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

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

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

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

1.2 动图演示

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

插入排序和直接选择排序都是稳定的_冒泡排序、选择排序、插入排序_第4张图片

代码实现:

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 动图演示

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

插入排序和直接选择排序都是稳定的_冒泡排序、选择排序、插入排序_第5张图片

 代码实现:

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

插入排序和直接选择排序都是稳定的_冒泡排序、选择排序、插入排序_第6张图片

代码如下:

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]}}

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

你可能感兴趣的:(插入排序和直接选择排序都是稳定的_冒泡排序、选择排序、插入排序)