标签:
基本思想
可以把插入排序看成是摸牌。把数组分成三个部分:
1.A[1...j-1]代表手中的牌(已经排序好了);
2.下标j指出当前正被插入手中的牌
3.A[j+1...n]代表仍在桌子上的牌堆
算法开始的时候手上只有一张牌,然后每次从牌堆中拿出一张牌插入到手中的正确位置,直到牌堆的牌为空。
每次插入时候的算法:
因为每次插入之前我们都保证手上的牌已经排序好了,我们只要从右面开始(j-1)找到第一个比A[j]小的牌(或者没有找到就应该插到第一位),就可以找到A[j]应该插入的位置。
伪代码
INSERTION-SORT(A) for j=2 to A.length key=A[j] //Insert A[j] into sorted sequence A[1...j-1] 将A[j]插入到已排序好的队列 A[1...j-1]中 i=j-1 while i>0 and A[i]>key A[i+1]=A[i] i=i-1 A[i+1]=key
实现跟测试代码
1 #include <iostream> 2 using namespace std; 3 4 void insertion_sort(int arr[],int length) 5 { 6 for(int j=2;j<=length;++j) 7 { 8 int key=arr[j]; 9 int i=j-1; 10 while(i>0&&arr[i]>key) //找到比key大的数就向后移一位 11 { 12 arr[i+1]=arr[i]; 13 i=i-1; 14 } 15 arr[i+1]=key; 16 } 17 } 18 19 int main() 20 { 21 int arr[]={0,5,2,4,6,1,3}; 22 insertion_sort(arr,6); 23 for(int i=1;i<=6;++i) 24 cout<<arr[i]<<‘ ‘; 25 cout<<endl; 26 system("pause"); 27 }
标签:
原文地址:http://www.cnblogs.com/runnyu/p/4677107.html