插入排序

来源:互联网 发布:网盘存储源码 编辑:程序博客网 时间:2024/06/02 06:20

插入排序的基本思想:跟打扑克牌一样,左手拿已经排好顺序的牌(不妨假设从左至右牌依次增大),右手拿到一张新的牌之后,从左手中的牌的最右边开始,依次与新拿到的牌比较,直到遇到一张比新牌小的牌为止,把新牌放在这张牌的右边。当然,如果你理牌的顺序是从左到右依次减小,只需从右到左找到第一张比新牌大的牌,把新牌放在它的右边。

下面给出两种算法

1,普通的循环比较

#include <stdio.h>#include <stdlib.h>#define L 6#define random(i) rand()%i//升序排列void sort1(int *a) {int i,j,key;for(j = 1; j < L; j++){key = a[j];i = j-1;while(i >= 0 && a[i] > key) {a[i+1] = a[i];i = i-1;}a[i+1] = key;}}//降序排列void sort2(int *a) {int i,j, key;for(j=1; j < L; j++) {key = a[j];i = j-1;while(i >= 0 && a[i] < key){a[i+1] = a[i];i--;}a[i+1] = key;}}int main() {int a[L], i;printf("排序之前:\n");for(i = 0; i < L; i++){a[i] = random(10);printf("%-5d", a[i]);}printf("\n递增排序:\n");sort1(a);for(i = 0; i < L; i++)printf("%-5d", a[i]);printf("\n递减排序:\n");sort2(a);for(i = 0; i < L; i++)printf("%-5d", a[i]);printf("\n");return 0;}
2、递归

#include <stdio.h>#include <stdlib.h>#define random(i) (rand()%i)#define L 6void sort(int a[], int p) {int i;int key; //key表示当前正在插入的元素的脚标if(p > 1) {sort(a, --p);}i = p - 1;key = a[p];while(i >= 0 && key < a[i]) {a[i + 1] = a[i];i--;}a[i + 1] = key;}int main(void) {int n;int a[L];printf("排序前:\n");for(n=0; n < L; n++){a[n] = random(10);printf("%-5d",a[n]);}sort(a, L);printf("\n排序后:\n");for(n=0; n < L; n++)printf("%-5d", a[n]);printf("\n");return 0;}

从运行效率来看,第二种递归方式要比第一种方式要高很多,尤其是当数组元素比较多的时候。

0 0
原创粉丝点击