插入排序:插入排序是将一个记录插入到已排序好的有序表中,从而得到一个新的、记录数增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 10
void 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];
}
}
}
}