与选择排序,冒泡排序一样,插入排序也是常规的排序法之一,
插入排序的思想主要放在"插入"二字,主要就是从待排序列中取第一个待排元素,然后与其前面已排序列的元素比较,比较成功(或大或小),那么就把这个已排元素往后挪一个位置,空出来的位置就是插入的位置,依次循环.下边来看个示意图:
要排的序列为 int array[] = {12,32,2,4,6,54,34,76,89,32,14};排序为升序排序.
(红色代表已排序列,黑色代表待排序列,绿色代表待排序列中的第一个元素)
第一次: {12,32,2,4,6,54,34,76,89,32,14 } 32前边有序序列没有比32大的元素,不需移动 ->
{12,32,2,4,6,54,34,76,89,32,14}
第二次: {12,32,2,4,6,54,34,76,89,32,14 } 2比12小, 12,32往后移一位 -> {空位,12,32,4,6,54,34,76,89,32,14} ->
2插入空位 -> {2,12,32,4,6,54,34,76,89,32,14}
第三次: {2,12,32,4,6,54,34,76,89,32,14} 4比12小, 12,32往后移一位 -> {2,空位,12,32,6,54,34,76,89,32,14} ->
4插入空位->{2,4,12,32,6,54,34,76,89,32,14}
.........
第N次:{2, 4, 6, 12, 14, 32, 32, 34, 54, 76, 89}
基本思想已经说完,需要注意的是,待排序列的第一个元素,需要存到临时变量,否则已排序列往后移动时会覆盖,下边直接看代码
#include <iostream>
#include <string.h>
#include <errno.h>
#include <stdio.h>
using namespace std;
//需要注意的是,这里的类模板需要放在头文件中去实现,这里为了直观,直接放这里了
template <typename T>
class Sort
{
private:
static void swap(T& nLeft, T& nRight)
{
T tmp = nLeft;
nLeft = nRight;
nRight = tmp;
}
public:
//Min2Max为升序\降序控制
static void Insert(T* nArray, int nLen, bool Min2Max = true)
{
for( int i=1; i<nLen; i++ )
{
int index = i;
T e = nArray[index]; //临时保存待排序列的第一个元素
for(int j=i-1; j>=0; j--)
{
if( Min2Max ? (e < nArray[j]):(e > nArray[j]))
{
nArray[j+1] = nArray[j]; //比较符合,那么已排元素往后移动一个位置
index = j; //更新插入位置
}
}
if(index != i)
{
nArray[index] = e; //将临时保存的元素插入循环得到的插入位置
}
}
}
};
int main(int argc, char* argv[])
{
int array[] = {12,32,2,4,6,54,34,76,89,32,14};
int len = sizeof(array)/sizeof(int);
Sort<int>::Insert(array, len);
for(int i=0; i<len; i++)
{
cout << array[i] << " ";
}
cout << endl;
return 0;
}
编译执行