插入法排序(含二分法)

来源:互联网 发布:2017香港mac口红多少钱 编辑:程序博客网 时间:2024/05/17 07:08

  插入法排序和冒泡法排序类似,都是对i前面的数组进行从小到大(从大到小)排序。只不过冒泡法排序是发现顺序不对的时候,通过左右相邻交换,直到最小或最大的到前面位置。插入法排序发现顺序不对,通过左边的数组全部往右偏移,最后最小的插入到相应位置而得到的。

程序员的资料库 排序算法

1.插入排序, 从第二个数开始,先将第二个数做一个副本放在一旁(变量中)。

2.第二个数同前一个数比较,小于则用前一个数覆盖第二个数, 然后将副本放在前一个数前面
3.再将第三个数做一个副本取出,第三个数同前一个数比较,小于则用前一个数覆盖第三个数(此时第二个数位置空闲), 然后用副本同前一个数的前一个数比较,如果小于,则用前一个数的前一个数覆盖在原本的第二个位置上(此时第一个位置空闲), 将副本放入即可。
4.将数组中接下来的数依次做与3类似步骤,以3类推将副本往前作比较。直到副本不小于比较的数则该轮插入结束

5.重复4步骤,直到最后一个数:

#include <stdio.h>/*插入法排序*/void sort3(int *digits, int nums){int i = 0, j = 0, k = 0;int tmp_digit = 0;for(i = 1; i < nums; i++){tmp_digit = digits[i];for(j = i - 1; j >= 0; j--){if(digits[j] > tmp_digit){digits[j + 1] = digits[j];}else{break;}}if(j != i - 1){digits[j + 1] = tmp_digit;}for(k = 0; k < nums; k++){printf("%d ", digits[k]);}printf("\n");}}int main(void){int nums = 0;int digits[] = {9,8,7,6,10,5,11,4,3,2,1,0};int i = 0;nums = sizeof(digits) / sizeof(nums);sort3(digits, nums);for(i = 0; i < nums; i++){printf("%d ", digits[i]);}printf("\n");return 0;}


1: 8 9 7 6 10 5 11 4 3 2 1 0
2: 7 8 9 6 10 5 11 4 3 2 1 0
3: 6 7 8 9 10 5 11 4 3 2 1 0
4: 6 7 8 9 10 5 11 4 3 2 1 0
5: 5 6 7 8 9 10 11 4 3 2 1 0
6: 5 6 7 8 9 10 11 4 3 2 1 0
7: 4 5 6 7 8 9 10 11 3 2 1 0
8: 3 4 5 6 7 8 9 10 11 2 1 0
9: 2 3 4 5 6 7 8 9 10 11 1 0
10: 1 2 3 4 5 6 7 8 9 10 11 0
11: 0 1 2 3 4 5 6 7 8 9 10 11

改进方法:二分法插入法排序

#include <stdio.h>int find_digit_idx(int *digits, int compare_digit, int start_index, int end_index){int i = 0;while(start_index <= end_index){i = (start_index + end_index) / 2;if(compare_digit < digits[i]){end_index = i - 1;}else{start_index = i + 1;}}/*start_index的时候就是刚好可以插入的地方*/return start_index;}/*插入法排序*/void sort3(int *digits, int nums){int i = 0, j = 0, start_index = 0;int tmp_digit = 0;for(i = 1; i < nums; i++){tmp_digit = digits[i];start_index = find_digit_idx(digits, tmp_digit, 0, i - 1);for(j = i - 1; j >= start_index; j--){digits[j + 1] = digits[j];}if(j != i - 1){digits[j + 1] = tmp_digit;}}}int main(void){int nums = 0;int digits[] = {9,8,7,6,10,5,11,4,3,2,1,0};int i = 0;nums = sizeof(digits) / sizeof(nums);sort3(digits, nums);for(i = 0; i < nums; i++){printf("%d ", digits[i]);}printf("\n");return 0;}


 

 

0 0
原创粉丝点击