排序算法之 - 插入排序

 与选择排序,冒泡排序一样,插入排序也是常规的排序法之一,
插入排序的思想主要放在"插入"二字,主要就是从待排序列中取第一个待排元素,然后与其前面已排序列的元素比较,比较成功(或大或小),那么就把这个已排元素往后挪一个位置,空出来的位置就是插入的位置,依次循环.下边来看个示意图:
    要排的序列为 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 }  212小, 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}   412小, 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;
}

编译执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值