八大排序算法之一直接插入排序(C语言)

概述

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

我们这里说说八大排序就是内部排序。


    

    当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。

   快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;

1.插入排序—直接插入排序(Straight Insertion Sort)

基本思想:

将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。

要点:设立哨兵,作为临时存储和判断数组边界之用。

直接插入排序示例:



如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

算法的实现:

它的核心思想为:将一个记录插入到一个已经排序好的表中,以得到一个记录增一的有序表。并且最关键的一点就是它把比当前元素大的记录都往后移动,用以腾出“自己”该插入的位置。当n-1趟插入完成后该记录就是有序序列。

#include "stdio.h"

void insert_sort(int a[],int n)

//待排序元素用一个数组a表示,数组有n个元素

{

    int i,j;

    int temp;

    for ( i=1; i表示插入次数,共进行n-1次插入

  {

      temp=a[i]; //把待排序元素赋给temptempwhile循环中并不改变,这样方便比较,并且它是要插入的元素

      j=i-1;

      //while循环的作用是将比当前元素大的元素都往后移动一个位置

      while ((j>=0)&& (temp

          a[j+1]=a[j];

          j--; // 顺序比较和移动,依次将元素后移动一个位置

          }

 

      a[j+1]=temp;//元素后移后要插入的位置就空出了,找到该位置插入

  }

}

void main(){

    int array[]={2, 10, 4, 5, 1, 9};

    int i=0;

    insert_sort(array,6);

    for(;i<=5;i++)

       printf("[%d]",array[i]);

    getch();

    }

效率:

时间复杂度:O(n^2).



你可能感兴趣的:(数据结构与算法)