插入排序算法的一种实现
插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。(摘自维基百科)
简单点理解就是这样:想象你拿着一副杂乱的扑克牌,然后你就会自然地将手中的牌换下位置,使其排好顺序对不对?以下的图片是借用《算法导论》的例子。
所以说插入排序就是分成两块区域,一块是已排好序的,另外一块是还没排好序的;只要你不断的从还没排好序的那块中取元素插入到已排好序的那块上,那么等到还没排序好的那块里的元素没了,就代表已经排好序了。
思路很简单,下面给出我的代码(排序函数的第二个for循环的前三句是为了能够直观地输出排序过程):
1 /* 2 * 这是我自己写的插入排序的写法,跟书本上的思想一样, 3 * 都是插入,不过实现的代码有所不同。 4 */ 5 #include<stdio.h> 6 #include<stdlib.h> 7 #include<time.h> 8 #define M 10 9 10 void insertion_sort(int *p) 11 { 12 int i, j, tmp; 13 for(i = 1;i < M; i++) 14 for(j = 0; j < i; j++) 15 { 16 printf( "%2d ", *(p + j) ); /* 输出 */ 17 if(j + 1 == i) /* 输出 */ 18 printf( "\n" ); /* 输出 */ 19 if(*(p + j) > *(p + i)) 20 { 21 tmp = *(p + j); 22 *(p + j) = *(p + i); 23 *(p + i) = tmp; 24 25 } 26 } 27 } 28 29 int main(void) 30 { 31 int i; 32 int a[M] = {0}; 33 34 //随机生成10个两位数 35 srand(time(0)); 36 for(i = 0; i < M; i++) 37 a[i] = rand() % 100; 38 39 printf( "未排序。。。\n" ); 40 for(i = 0; i < M; i++) 41 printf( "%2d ", a[i] ); 42 printf( "\n" ); 43 printf("\n排序中。。。\n"); 44 insertion_sort(a); 45 46 47 printf( "\n已排序。。。\n" ); 48 for(i = 0; i < M; i++) 49 printf( "%2d ", a[i] ); 50 51 printf( "\n" ); 52 53 return 0; 54 55 }
下面是运行的结果:
时间复杂度就是O(n^2)了,因为有两个循环嘛。