排序 直接简单插入排序C语言代码和原理-交换数据、移动数据两种解决方法

方法一:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	int arr[] = { 5, 7, 6, 4, 3, 8, 9, 2 };
	int len = sizeof(arr) / 4;
	int index = 0;
	int i, j;
	for (i = 0; i<len; i++)
	{
		int min = arr[i];
		for (j = i; j<len; j++)
		{
			if (arr[j]<min)
			{
				min = arr[j];
				index = j;
			}
		}
		int temp = arr[i];
		arr[i] = arr[index];
		arr[index] = temp;

	}

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

时间复杂度O(n^2)

例子:

5 7 6 4 3 8 9 2

第一次  2 7 6 4 3 8 9 5

第二次  2 3 6 4 7 8 9 5

第三次  2 3 4 6 7 8 9 5

第四次  2 3 4 5 7 8 9 6

第五次  2 3 4 5 6 8 9 7

第六次  2 3 4 5 6 7 9 8

第七次  2 3 4 5 6 7 8 9

原理:

每次遍历都选出最小的数字插到有序数字的后面,最小的数与要交换的数交换位置

方法二:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
	int arr[] = { 5, 7, 6, 4, 3, 8, 9, 2 };
	int len = sizeof(arr) / 4;     //数组长度
	int i;
	int index ;     //记录最小值的下标
	int k=0;     //判断是否更改操作
//每次都把最小的数弄到外面
	for (i = 0; i < len; i++)
	{
		int min = arr[i];     //将最小值设置为未排队的数组的第一个
		for (int j = i; j < len; j++)
		{
			if (arr[j] < arr[i])
			{
				index = j;     //找到最小值的下标 j ,将它赋给 index
				int temp = arr[j];     //
				min=arr[j];     //将最小值 arr[j] 暂时保存在temp,再赋值给min
				arr[j] = temp;     //
				k = 1;     //表示已更改最小值min
			}
		}
		if (k == 1)     //如果最小值min已更改才执行
		{
			for (int j = index - 1; j >= 0 + i; j--)
			{
				arr[j + 1] = arr[j];     //移动数组
			}
			arr[i] = min;     //把最小值插入到准备排列的数后面
		}
		k = 0;     //重置更新操作
	}

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

时间复杂度O(n^2)

例子:

5 7 6 4 3 8 9 2

第一次 2 5 7 6 4 3 8 9

第二次 2 3 5 7 6 4 8 9

第三次 2 3 4 5 7 6 8 9

第四次 2 3 4 5 7 6 8 9

第五次 2 3 4 5 6 7 8 9

原理:

每次都把未排序数字的最小值拿出来放到前面

猜你喜欢

转载自blog.csdn.net/obitosbb/article/details/90978675
今日推荐