插入排序

来源:互联网 发布:国内餐饮软件排名 编辑:程序博客网 时间:2024/04/30 09:05

插入排序:插入排序是将一个记录插入到已排序好的有序表中,从而得到一个新的、记录数增1的有序表;

其主要思路是,将序列的第一个记录看成是一个有序的子序列,然后从第二个记录逐个进行插入,直达整个序列有序;

时间复杂度大概是O(N2);

举个例子就是:

1,2,43,55,40,78,90,8.456

假设按照降序:

插入排序从第二个开始

第一次序列结果是:

2,1,43,55,40,78,90,8,456

第二次是:

43,2,1,55,40,78,90,8,456

第三次是:

55,43,2,1,40,78,90,8,456

详细解析第四次:

第四次指针指向40, 40 与前面排好序的有序列:55,43,2,1,中的最后一个1比较,发现比1大,将40 赋值给哨兵flag,那么将1往后移动,此时序列式55,43,2,1,1 ,40已复制到flag中,然后,将flag 与第四个从左往后比较,如果比flag小,则往后移动,第一次移动情况:

55,43,2,2,1 flag 依旧是40,再和第三个比,发现还是大了,于是记录继续后移:

55,43,43,2,1 flag 依旧是40,在和第二个比,发现合适了,于是,插入到这里:

55,43,40,2,1,

 

整个过程大概是这样的;

下面给出一个实例:

 

#include<iostream>using namespace std;#define N 10void Insert_D2(int *a );void Insert_D3(int *a );void SoupSeq(int *b);int Arr[N]= {49,38,1,76,13,27,56,77,11,15};int main(){//SoupSeq(Arr) ;//Insert_D2(Arr);//Insert_D3(Arr);return 0;}//直接插入排序;升序void Insert_D2(int *a){int temp;//哨兵for(int i = 1;i<N;i++){if(a[i]<a[i-1])//如果待插入的比结尾的小{temp = a[i];//将此值付给哨兵;a[i] = a[i-1];//序列扩大一个int j;for(j = i-1;(a[j]>temp) && j>=0;--j)  //如果往左边的一个大于哨兵a[j+1] = a[j]; //记录后移a[j+1] = temp;}}}//直接插入排序;降序void Insert_D3(int *b){int temp =0;for(int i = 1;i<N;i++){if(b[i]>b[i-1]){temp = b[i];b[i] = b[i-1];int j = 0;for(j= i-1;j>=0 && b[j]<temp;--j)b[j+1] = b[j];b[j+1] = temp;}}}//最简单的排序void SoupSeq(int *b){int temp;for(int i = 0;i<N;i++){for(int j = i+1;j<N;j++){if(b[i]>b[j]){temp = b[i];b[i] =  b[j];b[j] = temp;//下面是不使用临时变量做交换/*b[i] = b[i]+b[j];b[j] = b[i]-b[j];b[i] =b[i] -b[j];*///也可使用未操作来达到交换变量//b[i] = b[i]^b[j];//b[j] = b[j]^b[i];//b[i] = b[i]^b[j];}}}}


0 0
原创粉丝点击