欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

排序(C语言实现)

程序员文章站 2022-03-24 15:33:36
...

1. 交换排序

1.冒泡排序

1.基本原则:
   比较两两相邻记录的关键字,使不满足排序要求的记录交换位置,直到n-1轮循环结束
2.操作顺序(从小到大为例):
   (1)从头开始,比较 arr[i] 和 arr[i+1] ,如果第二个比第一个小,交换
   (2)指针向后移动,i=i+1,再次比较 arr[i] 和 arr[i+1] ,判断是否需要交换
   (3)循环操作以上步骤,直到指针指到最后一个位置
3.冒泡排序优化:
   如果在排序中间数据已经有序,但是普通的冒泡排序还会继续循环,增加时间的消耗。所以需要在算法中设置一个简单的标记位 flag 来判断这轮循环是否交换了数据,开始时将flag 置为1,进入第一重循环将其置为0,如果有交换就把 flag 置为1,只有交换过数据(即 flag 置为1)才会继续进入下一轮循环,否则排序结束

4.代码实现:

void swap(int *a, int *b) //交换数据函数
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

void BubbleSort(int arr[],int len) //参数:(数组,数组长度)
{
	int i, j;
	int flag = 1;
	for (i = 0; i < len - 1 && flag; i++)
	{
		flag = 0;
		for (j = 0; j < len - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				swap(&arr[j], &arr[j + 1]);
				flag = 1;
			}
		}
	}
}



2.选择排序

1.简单选择排序

1.基本原则:
   从待排序的数据中选出最值,交换该数据与待排序序列的头部数据,直到所有待排序的数据元素排序完毕
2.特点:
   (1)可以将序列分为两部分,刚开始整个序列都视为待排序序列,有序序列为空
   (2)第一轮循环先把最小值默认为第0个,进入第二轮循环
   (3)第二轮循环先找到最小值的下标,如果循环结束后min的值与开始不同,再进行交换
   (4)不断重复,直到数据排序结束
4.代码实现:
void SelectSort(int arr[], int len)
{
	int i, j, min;
	for (i = 0; i < len; i++)
	{
		min = i;
		for (j = i + 1; j < len; j++)
		{
			if (arr[min] > arr[j])
				min = j;
		}
		if (min != i)
		{
			swap(&arr[min], &arr[i]);
		}
	}
}

2.归并排序

1.基本思想:
   分治法的典型应用,将已经有序的两个子序列合并,在合并过程中对元素排序,从而得到一个完整有序的序列,也就是保证小范围的数据有序,再让大范围的数据有序
2.过程:
   (1)n个记录的序列,通常先视为n个小序列
   (2)相邻的两个小序列两两比较再合并,就有n/2个序列,即每次序列的数量减半
   (3)当序列数量为2时,进行归并排序,可以使原始序列完全有序