插入排序的概念:将数据插入到一个有序的序列中,从而得到一个新的有序的序列。
例如定义一个乱序的数组:
int a[10] = {23,31,11,24,1,4,7,9,36,42};
排序方法:
- 我们通常将数组第一个元素a[0]=23作为已经排好序的序列
- 然后从第二个元素a[1]=31开始,和之前已经排好序的序列进行比较。如果当前元素小于之前的元素就将之前元素往后面移,直到当前元素大于之前元素,将当前元素插入
第一次排序:发现比较简单,因为元素a[1]<a[0],直接将元素进行交换位置得到一个新的有序序列 {23,31}
第二次排序:是在第一次排序完成的基础上进行的,所以使用a[2] = 11 和之前的序列{23,31}里面的每一个元素去比较,比较的顺序是从后面向前面比较
- 也就是从a[1]=31开始与11比较,如果a[1]>11 ,则把a[1] 往后移动一个位置则a[2]=31,a[1]暂时为空
- 继续与之前的元素比较,也就是与a[0]=23与11比较,如果a[0]>11,则把a[0],往后面移动一个位置,即a[1]=23,a[0]为空
- 然后继续往前比较,发现已经没有元素,所以就可以把11插入到当前结束的空位置a[0] = 11
下面的排序依旧根据这种原理来做,最后根据思路得到完整程序:
#include <iostream>
using namespace std;
int a[10] = {31,23,11,24,1,4,7,9,36,42};
int main() {
int temp;//临时变量,因为a[i]是当前元素,会变成空位置
for (int i = 0 ; i < 10 ; i ++)
cout << a[i] << " ";
cout << endl;
for (int i = 1 ; i < 10 ; i ++) {
temp = a[i];//保存当前元素
while(i > 0 && a[i-1]>temp) {
a[i] = a[i-1];//将大于当前元素的前一个元素往后面移动
i--;
}
a[i] = temp;//将空位置补上当前元素
}
for (int i = 0 ; i < 10 ; i ++)
cout << a[i] << " ";
return 0;
}