插入排序, 算法複雜度爲o(n^2)
博主覺得插入排序就像是我們打撲克的時候,假設手中的牌是有序的,而下面摸得排是無序的,那麼 當我們拿一個牌後,假設這個牌是有序的,接着拿第二個牌,比較抽起的牌和手中有序牌,從後往前比較,當比手中有序的牌小的是時候,就找到了這個牌應該插入的位置。
下面是《數據結構與算法分析》中的描述:插入排序由N-1趟排序組成,對於P=1趟到P=N-1趟,插入排序保證從位置0到位置P上的元素爲已排序狀態。在第P趟,我們將位置P上的元素向左移動到它在前p+1個元素中的正確位置上去。從有序序列的最後一個元素開始查找,邊查找邊移動元素,而不是先找到插入位置再移動元素,這樣提高了效率。
看下面這個例子:
原始數組爲:a[6]=[34,8,64,51,32,21]
則插入排序每次的變化如下:
初始 | 34 | 8 | 64 | 51 | 32 | 21 | 移動位置 |
p=1 | 8 | 34 | 64 | 51 | 32 | 21 | 1 |
p=2 | 8 | 34 | 64 | 51 | 32 | 21 | 0 |
p=3 | 8 | 34 | 51 | 64 | 32 | 21 | 1 |
p=4 | 8 | 32 | 34 | 51 | 64 | 21 | 3 |
p=5 | 8 | 21 | 32 | 34 | 51 | 64 | 4 |
代碼實現:
#include<stdio.h>
#include<stdib.h>
void InsertionSort(int arr[].int N)
{int p,j;
int temp;
for(p=1;p<N;p++)/*第P趟,把第P個元素後的無序元素和前P-1個有序元素作比較*/
{temp=arr[p];
for(j=p-1;j>0&&arr[j]>temp;j--)
{arr[j+1]=arr[j];
}
arr[j+1]=temp;
}
}
int main()
{
int array[] = {5, 15, 3, 20, 11};
InsertionSort(array, sizeof(array)/sizeof(int));
for(int i = 0; i < 5; ++i)
printf("%d ", array[i]);
printf("\n");
}