演算法精解(一)——插入排序,演算法精解插入排序
<pre name="code" class="cpp"><span style="background-color: rgb(255, 255, 255);">// 插入排序// // O(n^2),在遞增序列插入1個元素時,O(n)#include "sort.h"void issort(void *data, int size, int esize, int (*compare)(const void *key1, const void *key2)){int i, j;int *a =(int *)data;int *key;// 為key申請空間if ((key = (int *)malloc(sizeof(char))) != NULL){return;}// 初始化jj = 1;while(j <= size) // j為待排序的元素, 一步一步向右移動{// key作為緩衝memcpy(key, &a[j], sizeof(int));i = j - 1;// i從j的左邊一個位置開始while(i <= j){if(compare(key, &a[i]) < 0)//a[j] < a[i]{memcpy(&a[i + 1], &a[i], sizeof(int)); // 整個數組向右移動一個位置i--;}}// 插入a[j]正確的位置memcpy(&a[i + 1], key, sizeof(int));j++;}free(key);return;}</span>
插入排序演算法?
插入排序:
將新的資料與已經排好序的資料逐個比較,如果比某一個資料大(小)就將新資料放到該資料後面(前面),剩下的資料整體往後移一個位置。一般插入排序用於鏈表比較方便。因為鏈表不需要整體往後移這一步驟。
數組:
int a[10]={6,1,2,7,4,8,9,0,5,3};
int b[10]={0}
int i,j;
for(i=0;i<10:i++)
{
for(j=i;j>0;j--)
{
if(b[j-1]>=a[i])
b[j]=b[j-1];
}
b[j]=a[i];
}
演算法:【插入排序】與【直接插入排序】有不同?
直接插入排序
直接插入排序(straight insertion sort)的作法是:
每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。
第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個資料與前兩個數從前向後掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(n-1)趟掃描以後就完成了整個排序過程。
直接插入排序屬於穩定的排序,最壞時間複雜性為O(n^2),空間複雜度為O(1)。
直接插入排序是由兩層嵌套迴圈組成的。外層迴圈標識並決定待比較的數值。內層迴圈為待比較數值確定其最終位置。直接插入排序是將待比較的數值與它的前一個數值進行比較,所以外層迴圈是從第二個數值開始的。當前一數值比待比較數值大的情況下繼續迴圈比較,直到找到比待比較數值小的並將待比較數值置入其後一位置,結束該次迴圈。
值得注意的是,我們必需用一個儲存空間來儲存當前待比較的數值,因為當一趟比較完成時,我們要將待比較數值置入比它小的數值的後一位 插入排序類似玩牌時整理手中紙牌的過程。插入排序的基本方法是:每步將一個待排序的記錄按其關鍵字的大小插到前面已經排序的序列中的適當位置,直到全部記錄插入完畢為止。
插入排序
有一個已經有序的資料序列,要求在這個已經排好的資料序列中插入一個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法,插入排序的基本操作就是將一個資料插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為O(n^2)。是穩定的排序方法。插入演算法把要排序的數組分成兩部分:第一部分包含了這個數組的所有元素,但將最後一個元素除外,而第二部分就只包含這一個元素。在第一部分排序後,再把這個最後元素插入到此刻已是有序的第一部分裡的位置