插入法排序(含二分法)

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

插入法排序(含二分法)_第1张图片

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;
}


 

 

你可能感兴趣的:(插入法排序(含二分法))