插入排序,故名思绪,找一个合适的数,插入到相应的位置来达到集合整体有序的目的,具体来说以递增排序为例。取无序集合的首元素,从有序集合的末尾开始找,直到找到一个小于该元素的值结束遍历,将无序集合的元素插入到找到这个元素的后面。
因为不会改变两个相等元素的位置,所以是稳定排序,只需要一个额外的空间,所以控件复杂度为O(1),时间复杂度为O(n^2)。
例如,有集合1,2,7,9,6,3。1,2,7,9部分就是有序的,6,3部分就是无序的,无序集合的首元素就是6,那么问题就是6该插入到什么位置,从有序集合的1,2,7,9末尾9开始找,设6的下标为x,9的下标为y,6<9,那么y--,将9元素向后移一位,空出位置将来放“6”;6<7,y--,7元素后移一位;6>2,此时遍历结束,因为y此时是1,所以放6的位置应该是y+1;然后不断的循环下去。
#include<string>
#include<iostream>
#include<cstring>
#include<head.h>
using namespace std;
//插入排序算法,选出无序集合的第一个元素,从有序集合的末尾开始扫描,直到第一个大于该数,插入到其后面
void insertSort(int *,int);
int main()
{
int arr[] = {7,1,6,4,5,2,8,10,3,9,11,12};
int length = sizeof(arr)/sizeof(int);
cout << "原来的序列:" << endl;
for(auto var : arr)
{
cout << var << " ";
}
insertSort(arr,length);
cout << "\n现在的序列:" << endl;
for(auto var : arr)
{
cout << var << " ";
}
return 0;
}
void insertSort(int *arr,int length)
{
for(int ix=1;ix<length;++ix)
{
int curr_elem = arr[ix]; //1 //ix是无序集合,所以需要取无序集合的首元素和有序集合的jy进行对比
int jy = ix - 1; //0
while(jy>=0 && curr_elem < arr[jy])
{
arr[jy + 1] = arr[jy];
jy--;
}
arr[jy + 1] = curr_elem;
}
}
输出:
原来的序列:
7 1 6 4 5 2 8 10 3 9 11 12
现在的序列:
1 2 3 4 5 6 7 8 9 10 11 12
注意1:内存循环jy跳出循环的条件是jy>=0,我不是jy>0,因为还需要和第一个元素进行比较。
注意2:因为元素需要不断向后移,所以无需集合的首元素,一定要copy一份,避免被覆盖。