'C语言' | 快速排序算法

时光总嘲笑我的痴心妄想 提交于 2020-01-12 01:30:25

快速排序

【算法描述】

快速排序算法是排序算法中一般情况下时空复杂度较小的排序算法,快速排序的算法思想是:选定一个轴值为基准,将整个序列划分为两个子序列,通过排序将轴值前的数值都是比它小的,轴值后的数值都是比它大的值,然后依次对每个部分进行划分。

【算法思路】

以第一个记录作为轴值,对待排序序列进行划分的过程为:
(1)初始化:取第一个记录作为基准,设置两个参数i,j分别用来指示将要与基准记录进行比较的左侧记录位置和右侧记录位置,也就是本次划分的区间;
(2)右侧扫描过程:将基准记录与j指向的记录进行比较,如果j指向记录的关键码大,则j前移一个记录位置。重复右侧扫描过程,直到右侧的记录小(即反序),若i<j,则将基准记录与j指向的记录进行交换;
(3)左侧扫描过程:将基准记录与i指向的记录进行比较,如果i指向记录的关键码小,则i后移一个记录位置。重复左侧扫描过程,直到左侧的记录大(即反序),若i<j,则将基准记录与i指向的记录交换;
(4)重复(2)(3)步,直到i与j指向同一位置,即基准记录最终的位置。

【操作描述】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【算法实现】

#include <stdio.h>
int Partition(int r[], int First, int End);
void Quicksort(int r[], int First, int End);
int main()
{
	int n;
	printf("请输入你要排序的数组中数值的个数:");
	scanf("%d",&n);
	int r[n];
	printf("请依次输入你要排序的数组中的数值:");
	for(int i=0; i<n; i++)
	scanf("%d",&r[i]); 
	printf("\n\n");
	Quicksort(r, 0, n-1);
	for(int i=0;i<n;i++)
	printf("%d\t",r[i]);
	return 0;
} 
void Quicksort(int r[], int First, int End)
{
	int pivot;
	if(First < End)
	{
		pivot = Partition(r, First, End);
		Quicksort(r, First, pivot);
		Quicksort(r, pivot+1, End);
	}
}
int Partition(int r[], int First, int End)
{
	int i=First, j=End;
	int temp;
	while(i<j) // 判断是否还存在可以扫描的部分 
	{
	while(i<j && r[i] <= r[j]) // 右扫描,若右边的数比他大就判断倒数第二个数 
	j--;
	if(i<j) // 将较小的交换到前面 ,注意此时是经过右扫描的数值,此数值一定大于前面的数值 
	{
		temp = r[i];
		r[i] = r[j];
		r[j] = temp;
		i++;//这里是使前面的下标加1,因为这前面的数都是比扫描数小的数 
	}
	while(i<j && r[i] <= r[j])  //左扫描 
	i++;
	if(i<j) //将较大的数值交换到后面,此数值一定比后面的数值大 
	{
		temp = r[i];
		r[i] = r[j];
		r[j] = temp;
		j--;//这里是后面的下标往前-1,因为这后面的数值都比被扫描的数值大 
	}
	}
	return j; //返回扫描记录点 
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!