插入排序(c實現)

插入排序, 算法複雜度爲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 34 51 64 32 21 1
p=4 8 32 34 51 64 21 3
p=5 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");  
}  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章