【数据结构与算法】排序算法之六:快速排序

本文深入介绍了快速排序算法的基本思想与实现过程,并通过实例演示了其工作原理。快速排序是一种高效的排序方法,采用分治策略,通过选取基准元素将数据集划分为两个子集,递归地对子集进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一  快速排序

排序算法中的奥斯卡,诺贝尔奖,当属快速排序!

快速排序是20世纪十大算法之一!!!!!!!!

1  基本思想

前面提到冒泡排序,它是一种交换排序,堪称最慢的排序算法。可是,物极必反,快速排序是冒泡排序的升级加强版,同属于交换排序类。

以”空间“换时间,快速排序不是相邻元素的交换,而是加大了比较和交换的距离,从而减少总的比较次数和移动交换次数。就拿考试分数来说,首先,60分几个,我们以60分为标准,从一堆分数中高于60扔一堆,低于60仍另一堆,管你第一还是倒数,然后80分以上优秀,我们就在60分以上的那一堆中,以80分为标准,高于80甩一边,低于80你可以走了,你不是优秀学生。这样一来我们反复进行这样的划界,分类,不断缩小标准之间的差,这样就得到了一个按序排列的分数表了。

2.实现

真枪实弹来演练一下快速排序算法,下面看具体的代码实现:

首先是快速排序的主体:

void Quick_Sort(SortArray *A , int low , int high)
{
	if (low < high)  //low == high代表只有一个数了,此时退出循环
	{
		int mid = Partition(A , low ,high);	//每次得到划分的标准
		//递归
		Quick_Sort(A , low ,mid-1);	//分成两堆继续递归循环
		Quick_Sort(A, mid +1 , high);
	}
}

算法中最重要的是Partition部分,就是选取标准,然后分成两堆。

int Partition(SortArray *A , int low ,int high)
{
	int temp = (*A)[low];
	while ( low < high)
	{
		//将比temp值小的数换到数组的低端
		while ( low < high && (*A)[high] >= temp)
		{
			high--;  //如果比temp大则不替换
		}
		if (low < high)  //比temp小则替换
		{
			(*A)[low]  = (*A)[high];  //此处由于已将A[low]的值赋给temp,所以可以不必替换而是直接修改
			low++;	
		}
		//将比temp值大的数换到数组的高端
		while ( low < high && (*A)[low] <= temp)
		{
			low++;  //如果比temp小则不替换
		}
		if (low < high)  //比temp大则替换
		{
			(*A)[high]  = (*A)[low];  
			high--;	
		}
	}//最后low==high则推出循环
	//此处将temp值传递到中间被修改的值上
	(*A)[low] = temp;

	return low;
}

对于快速排序的优化主要是针对Partition函数体的优化,如何选择这个”标准“,有兴趣的可以研究一下,说不定你的算法就是下一个”十大算法“


下面附上主程序:

#include <stdio.h>
#include "stdafx.h"
#include <iostream> 
using namespace std;

#define MAX 100
typedef int SortArray[MAX];

int _tmain(int argc, _TCHAR* argv[])
{
	int n ;
	SortArray A;                                                                                                                                              cout<<"/**排序**/\n"
		<<"请输入数组个数"<<endl;
	cin>>n;
	cout<<"请输入待排序数组"<<endl;
	for (int i = 0 ; i < n ; i++)
	{
		cin>>A[i];
	}
	cout<<"正在排序请稍后....."<<endl;
	Quick_Sort(&A , 0 , n-1);
	cout<<"排序结果如下....."<<endl;
	for (int i = 0 ; i < n ; i++)
	{
		cout<<A[i]<<endl;
	}
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值