插入排序
来源:互联网 发布:网盘存储源码 编辑:程序博客网 时间: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
- 插入排序-【插入排序】
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- Scripts:查询log file sync 等待的脚本lfsdiag.sql
- 年薪50万美金的工程师到底牛在哪里?
- 安卓使用GridView点击背景为黄色,自定义Gridview背景色
- ThinkPHP框架设计与扩展总结
- 从hiredis使用出core谈谈redis多线程的使用
- 插入排序
- ZOJ-3056
- Iterator(迭代器)的一般用法
- java基础加强_代理
- FZU 2128 最长子串
- 为什么已经引用了using System.Management 使用ManagementObjectSearcher时为什么提示未引用空间?
- Scripts:此脚本慎用lob_fragmentation_user.sql
- Android中如何获取设备的宽高
- [ALGO-50] 数组查找及替换