【C】排序算法之插入排序

1、算法基本思想

  第一个数不需要排序,因此比较趟数 i 为[1, size-1]或者[1, size),j 从 i-1 这个位置开始比较(从后往前找),最后比较到下标为0的位置或者第一个不大于array[i]的数,比array[i]大的数都向后移动一格,这样其实就相当于空出来一格,如果找到不大于array[i]的数,就把array[j]放到该位置的下一个位置。

2、源代码

InsertSort

/*
*	函数名称:InsertSort
*
*	函数功能:直接插入排序(普通)
*
*	入口参数:array, size
*
*	出口参数:void
*
*	返回类型:void
*/

void InsertSort(int array[], int size)
{
	int i = 0;
	int j = 0;
	int key = 0;

	for (i = 1; i < size; i++)
	{
		//防止array[i]在交换数据的过程中发生变化
		key = array[i];

		//依次比较key和key之前的数,以及key的前一个数的前一个数,依此类推
		for (j = i - 1; (j >= 0) && (array[j] > key); j--)
		{
			//不交换数据,直接用前一个数替换掉后一个数,这样就可以空出来一个格子
			array[j + 1] = array[j];
		}
		//此时array[j] <= key,在该位置的下一个位置插入key即可
		array[j + 1] = key;
	}

	return;
}

main

#define _CRT_SECURE_NO_WARNINGS 1

/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:InsertSort.c
* 功能:插入排序
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年7月8日10:46:23
*/

# include <stdio.h>

/*
*	函数名称:main
*
*	函数功能:测试主程序
*
*	入口参数:void
*
*	出口参数:0
*
*	返回类型:int 
*/

int main(void)
{
	int i = 0;
	int numbers[] = {3, 1, 6, 4, 5, 2};
	int len = sizeof(numbers) / sizeof(int);

	printf("排序之前:\n");

	for (i = 0; i < len; i++)
	{
		printf("%d ", numbers[i]);
	}

	InsertSort(numbers, len);

	printf("\n排序之后:\n");

	for (i = 0; i < len; i++)
	{
		printf("%d ", numbers[i]);
	}

	printf("\n");

	return 0;
}

优化

  前面有序,查找时用二分查找。

/*
*	函数名称:InsertSort
*
*	函数功能:直接插入排序(优化,二分法)
*
*	入口参数:array, size
*
*	出口参数:void
*
*	返回类型:void
*/

void InsertSort(int array[], int size)
{
	int i = 0;
	int j = 0;
	int key = 0;
	int left = 0;
	int right = 0;
	int mid = 0;

	for (i = 1; i < size; i++)
	{
		left = 0;
		right = i - 1;
		//防止array[i]在交换数据的过程中发生变化
		key = array[i];

		while (left <= right)
		{
			mid = (left & right) + ((left ^ right) >> 1);

			if (array[mid] <= key)
			{
				left = mid + 1;
			}
			else
			{
				right = mid - 1;
			}
		}
		
		//left是要插入的位置
		for (j = i; j > left; j--)
		{
			//数据的搬移
			array[j] = array[j - 1];
		}

		array[j] = key;
	}

	return;
}

3、输出结果


猜你喜欢

转载自blog.csdn.net/sustzc/article/details/81055720