八大排序演算法之一直接插入排序(C語言)
概述
排序有內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。
我們這裡說說八大排序就是內部排序。
當n較大,則應採用時間複雜度為O(nlog2n)的排序方法:快速排序、堆排序或歸併排序序。
快速排序:是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分佈時,快速排序的平均時間最短;
1.插入排序—直接插入排序(Straight Insertion Sort)
基本思想:
將一個記錄插入到已排序好的有序表中,從而得到一個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是一個有序的子序列,然後從第2個記錄逐個進行插入,直至整個序列有序為止。
要點:設立哨兵,作為臨時儲存和判斷陣列邊界之用。
直接插入排序示例:
如果碰見一個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩定的。
演算法的實現:
它的核心思想為:將一個記錄插入到一個已經排序好的表中,以得到一個記錄增一的有序表。並且最關鍵的一點就是它把比當前元素大的記錄都往後移動,用以騰出“自己”該插入的位置。當n-1趟插入完成後該記錄就是有序序列。
#include "stdio.h"
void insert_sort(int a[],int n)
//待排序元素用一個數組
{
int i,j;
int temp;
for ( i=1; i<n; i++) //i表示插入次數,共進行n-1次插入
{
temp=a[i]; //把待排序元素賦給temp,temp在while迴圈中並不改變,這樣方便比較,並且它是要插入的元素
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).