版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/keheinash/article/details/53539971
直接插入排序的核心思想是把一个记录插入一个有序序列中,每插入一个记录就得到一个新的有序序列,直到所有记录都插入成功,得到有序序列。
每次插入记录时的有序序列如何得到,关键在第一次,第一次要插入的记录时序列的第二个值,有序序列只有一个值,就是第一个记录。
代码:
#include <string.h>
#include <malloc.h>
#include <iostream>
using namespace std;
void printArray(int a[], int n){
for(int j= 0; j < n; j++){
cout<<a[j] <<" ";
}
cout<<endl;
}
void DirectInsertSort(int a[], int n){
for(int i = 1; i < n; i++){
if(a[i] < a[i-1]){//比有序序列的最后一个值小,在有序序列中查找位置插入
int x = a[i];//记录待插入记录,因为等下这个位置可能会被后移的记录“占用”
int j = i - 1;
for(; j >= 0; j--){//有序序列范围从从0到i-1
if(x < a[j]){//比当前记录小,还要往前查找
a[j+1] = a[j];//当前记录往后移,给待插入记录“腾出”位置
}
else{
break;
}
}
a[j+1] = x;//j+1就是要插入的位置
}
printArray(a, 10);
}
}
int main(){
int a[10] = {10,2,3,238,7,7,2005,0,412,9};
DirectInsertSort(a, 10);
}
时间复杂度:O(n^2)
稳定性:从代码里看,记录后移的条件是x < a[j],即如果两个记录相等,不会发生后移,相对位置保持不变。事实上,相等的记录也没必要变动位置,因此直接插入排序是一种稳定的排序算法。