排序详解:直接插入排序

来源:互联网 发布:sql书写规范 编辑:程序博客网 时间:2024/06/06 06:55

直接插入排序,指每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。具体方法是第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。它是由两层嵌套循环组成的,外层循环标识并决定待比较的数值,内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
这里写图片描述

简单来说,就是每次选择一个元素,将其放入有序序列中。(n-1)次操作之后,整个数组就已有序。

eg:
6 8 5 7 1 2 4 3
6|8 5 7 1 2 4 3
6 8|5 7 1 2 4 3
5 6 8|7 1 2 4 3
5 6 7 8|1 2 4 3
1 5 6 7 8|2 4 3
1 2 5 6 7 8|4 3
1 2 4 5 6 7 8|3
1 2 3 4 5 6 7 8
整个排序结束,看起来是【n-1】次操作,但是在每次插入的过程中需要从头重新遍历,实际上的应该是n*n级别的操作。

所以,直接插入排序是n*n级别时间复杂度的排序方法,隶属于插入排序,隶属于内部排序。

代码实现:

#include <stdio.h>#include<iostream>using namespace std;void InsertSort(int R[], int n){    int i, j;    int temp;    for (i = 1; i < n; ++i)    {        temp = R[i];        j = i - 1;        while (j >= 0 && R[j] > temp)        {            R[j + 1] = R[j];            --j;        }        R[j + 1] = temp;    }}int main(){    int a;    int b[7] = { 22,12,16,2,11,44,55 };    InsertSort(b, 7);    for (a = 0; a < 7; a++)    {        printf("%d\n", b[a]);    }    system("pause");    return 0;}
原创粉丝点击