1. 程式人生 > >八大排序演算法之一直接插入排序(C語言)

八大排序演算法之一直接插入排序(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; i++) //i表示插入次數,共進行n-1次插入

  {

      temp=a[i]; //把待排序元素賦給temptempwhile迴圈中並不改變,這樣方便比較,並且它是要插入的元素

      j=i-1;

      //while迴圈的作用是將比當前元素大的元素都往後移動一個位置

      while ((j>=0)&& (temp<a[j])){

          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).