交换排序------快速排序

背景:快速排序算法又称为分区交换排序算法,该排序算法使用分割对排序文件中的记录进行排序。

思路如下:

从待排序记录中任选一个记录,以这个记录的排序码作为中心值,将其他所有记录划分成两个部分

  • 第1部分包括所有排序码小于中心值的记录
  • 第2部分包括所有排序码大于中心值的记录
  • 其排序码作为中心值的这个记录,在排序后必然处在这两部分的中间位置
  • 排序码等于中心值的被划归到第1部分还是第2部分是随便的,在这里我们划归到第1部分,这就导致了快速排序是不稳定的排序算法

对上述两部分继续采用同样的方法进行排序处理,直到每个部分为空或者只含有一个记录为止。至此,待排序文件中的每一个记录都被放到正确的排序位置。

--------参考文献   熊岳山,祝恩.数据结构与算法[M].北京:清华大学出版社,2013:109-113.

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define MaxSize 100
typedef int ElemType;
typedef struct forSort
{
	ElemType key;
}ForSort;
typedef ForSort* pAr;

int ReadTxtToArry(pAr par)
{
	assert(par != NULL);
	int i = 0;
	FILE* fp;
	errno_t err = fopen_s(&fp, "sort.txt", "r");
	if (err != 0)	//打开文件失败
		exit(1);
	while (!feof(fp))
	{
		fscanf_s(fp, "%d", &par[i++]);
	}
	return i;
}

/*****************************************************************
*函数名:QuickSort
*函数功能描述:将记录按排序码非递减排序
*函数参数:par-记录数组,low-左边界,high-右边界
*函数返回值:无返回值
*作者:王赋睿小胖子
*函数创建日期:2018.6.17
*函数修改日期:尚未修改
*修改人:尚未修改
*修改原因:尚未修改
*版本:1.0
*历史版本:无
*****************************************************************/
void QuickSort(pAr par, int low, int high)
{
	assert(par != NULL);

	int i, j;
	forSort temp;

	if (low >= high) return;	//递归终止条件

	i = low;
	j = high;
	temp = par[i];
	while (i < j)
	{
		while (i < j&&temp.key < par[j].key)--j;//从后向前比较,直到当前记录的排序码小于等于中心值
		if (i < j)	
			par[i++] = par[j];	//将排序码小于等于中心值的记录交换到前面当前空出的记录位置		
		while (i < j&&par[i].key <= temp.key)++i;//从前向后进行比较,直到当前记录的排序码大于中心值
		if (i < j)
			par[j--] = par[i];	//将排序码大于中心值的记录交换到后面当前空出的记录位置
	}
	par[i] = temp;		//找到中心值对应的记录所在的位置,写入中心值对应的记录
	QuickSort(par, low, --j);	//递归处理排序码小于等于中心值的那组记录
	QuickSort(par, ++i, high);	//递归处理排序码大于中心值的那组记录
}

void PrintArry(pAr par, int n)
{
	assert(par != NULL);
	assert(n > 0);

	for (int i = 0; i < n; ++i)
	{
		printf("%-4d", par[i]);
	}
	printf("\n");
}

int main()
{
	ForSort ar[MaxSize];
	int n= ReadTxtToArry(ar);
	printf("快速排序前:");
	PrintArry(ar, n);
	QuickSort(ar, 0, n - 1);
	printf("快速排序后:");
	PrintArry(ar, n);
	return 0;
}
本程序在VS2017下运行通过

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/80721706