插入排序--《编程珠玑》

插入排序详解
本文详细介绍了插入排序算法的工作原理及实现过程。插入排序是一种简单直观的排序方法,通过将一个待排序的数据插入到已排序的数据序列中,使得整个序列仍然保持有序状态。适用于小规模数据排序。

如百度百科:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置。

简而言之,就是将一个数据很好的插入已经有序的数列中,当然,依然是递增或是递减;

思想:首先第一个数据肯定是有序的,由第二个数据开始处理,进行插入排序


以上述4个简单的数据为例,首先默认3是有序的,从第二个数据1开始,插入排序之后为1 3,接下来对第三个数据4进行排序...依次类推:

核心代码:

for(int i = 1; i < n; i++)
    {
        for(int j = i; j > 0 && a[j - 1] > a[j]; j--)
            swap(a[j - 1], a[j]);
    }
若是对swap函数不习惯,写简单的交换也一样:

for(int i = 1; i < n; i++)
    {
        for(int j = i; j > 0 && a[j - 1] > a[j]; j--)
        {
            temp = a[j];
            a[j] = a[j - 1];
            a[j - 1] = temp;
        }
    }
这时我们发现中间可能在进行一些无用的交换,比如上述最后一个2数据,先将2 4交换,后将2 3交换。其实我们将3 4向后移一位,再将2插入即可,如果数据大浪费的时间更多:

int j;
    for(int i = 1; i < n; i++)
    {
        temp = a[i];
        for(j = i; j > 0 && a[j - 1] > a[j]; j--)
            a[j] = a[j - 1];
        a[j] = temp;
    }
作者说上述的时间各有不同,由于本人的数据过小,感觉不到:


顺序如上...完整代码:

#include <iostream>
#include <algorithm>

using namespace std;

void sort(int a[], int n)
{
    int temp;
    int j;
    for(int i = 1; i < n; i++)  //sort3
    {
        temp = a[i];
        for(j = i; j > 0 && a[j - 1] > a[j]; j--)
            a[j] = a[j - 1];
        a[j] = temp;
    }
    /*for(int i = 1; i < n; i++)  //sort2
    {
        for(int j = i; j > 0 && a[j - 1] > a[j]; j--)
        {
            temp = a[j];
            a[j] = a[j - 1];
            a[j - 1] = temp;
        }
    }*/
    /*for(int i = 1; i < n; i++)  //sort1
    {
        for(int j = i; j > 0 && a[j - 1] > a[j]; j--)
            swap(a[j - 1], a[j]);
    }*/
}

void display(int a[], int n)
{
    for(int i = 0; i < n; i++)
        cout << a[i] << "  ";
    cout << endl;
}

int main()
{
    int a[] = {3, 1, 2, 4, 8, 9};
    int n = sizeof(a) / sizeof(int);
    sort(a, n);

    display(a, n);
    return 0;
}

O(∩_∩)O


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值