27.插入排序

自从上次小桂子发现了冒泡排序后,他开始相信自己的聪明才智比伴读小书童居然要高,所以他更加热衷于排序算法研究了,没事的时候,时不时找几个宫女演练一下,这时他又发现了一个新的排序方式,对于一下宫女们的队列:

1.首先,我们只考虑第一个元素,从第一个元素171 开始,该元素可以认为已经被排序;

2.取下一个元素161 并记录,并让161 所在位置空出来,在已经排序的元素序列中从后向前扫描;

3.该元素(171)大于新元素,将该元素移到下一位置;

4.171前已经没有最大的元素了, 则将161 插入到空出的位置;

5.取下一个元素163,并让163 所在位置空出来,在已经排序的元素序列中从后向前扫描;

6.该元素(171)大于新元素163,将该元素移到下一位置;

7.继续取171 前的元素新元素比较,直到找到已排序的元素小于或者等于新元素的位置;新元素大于161,则直接插入空位中;

8.重复步骤2~7,直到完成排序;

插入排序: 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place 排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

具体算法描述如下:

1.从第一个元素开始,该元素可以认为已经被排序;

2.取出下一个元素,在已经排序的元素序列中从后向前扫描;

3.如果该元素(已排序)大于新元素,将该元素移到下一位置;重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

4.将新元素插入到该位置;重复步骤2~5。

代码实现:

#include <stdio.h>
#include <stdlib.h>

void swap(int* num1, int* num2)//交换两个指针保存的值
{
	int temp = *num1;
	*num1 = *num2;
	*num2 = temp;
}

void InsertSort(int arr[], int len)
{
	int current = 0;
	int preIndex = 0;

	for (int i = 1; i < len; i++)
	{
		current = arr[i];
		preIndex = i - 1;

		while (preIndex >= 0 && arr[preIndex] > current)
		{
			arr[preIndex + 1] = arr[preIndex];
			preIndex--;
		}
		arr[preIndex + 1] = current;
	}
}

int main()
{
	int beauties[] = { 163, 161, 158, 165, 171, 170, 163, 159, 162 };

	int len = sizeof(beauties) / sizeof(beauties[0]);

	InsertSort(beauties, len);

	printf("美女排序以后的结果是:\n");
	for (int i = 0; i < len; i++)
	{
		printf("%d ", beauties[i]);
	}

	system("pause");
	return 0;
}

参考资料来源:

奇牛学院

posted @ 2023-06-26 10:00  CodeMagicianT  阅读(13)  评论(0编辑  收藏  举报