C++快速排序算法简明理解

 更新时间:2022年05月27日 08:57:03   作者:m78星云杰克  
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影

一、问题描述

[问题] 应用快速排序方法对一个记录序列进行升序排列。快速排序(quick sort)的分治策略如下。

(1)划分:选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列r(1)… r(i-1))和r(i+1)…r(n),轴值的位置i在划分的过程中确定,并且前一个子序列中的记录均小于或等于轴值,后一个子序列中的记录均大于或等于轴值;

(2)求解子问题:分别对划分后的每一个子序列造归处理;

(3)合并:由于子序列排序是就地进行的,所以合并不需要任何操作。

二、想法

[想法] 首先对待 排序记录序列进行划分,划分的轴值应该遵循平衡子问题的原则,使划分后的两个子序列的长度尽量相等,这是决定快速排序算法时间性能的关键。轴值的选择有很多方法,例如,可以随机选出一个记录作为轴值,从而期望划分是较平衡的。

第一次划分过程:

后续排序结果:

三、算法实现

int Partition(int r[],int start,int end) {        
	int i=start,j=end;
	while(i<j) {
		while (i<j&&r[i]<=r[j])    //对右侧扫描,即r[i] 与右侧的r[j...i+1]比较,升序排序,如果有小于r[i]的值,即右小于左则跳出循环,还有i>=j也跳出循环,即比较完,没有比它小的,必须两个条件同时满足。
			j--;
		if(i<j) {      //在i<j的情况下满足r[j]<r[i]
			r[i]=r[i]^r[j];    //交换值
			r[j]=r[i]^r[j];		//注意:如果位置一样不可以使用异或交换值,即r[1]不能异或r[1];
			r[i]=r[i]^r[j];    //也可以定义中间值,进行交换
			i++;
		}
	}
	while (i<j&&r[i]<=r[j])//对左侧扫描,即r[j] 与左侧的r[i...j-1]比较,升序排序,如果有大于r[j]的值,即左侧值大于右侧值则跳出循环,还有i>=j也跳出循环,即比较完,没有比它大的,必须两个条件同时满足。
		i++;
	if(i<j) {    //在i<j的情况下满足r[i]>r[j]
		r[i]=r[i]^r[j];
		r[j]=r[i]^r[j];
		r[i]=r[i]^r[j];
		j--;
	}
	return i;     //返回轴值
}
void Quicksort(int r[],int start ,int end) {     //快速排序 
	int pivot;      //记录轴值
	if(start<end) {     //界限值
		pivot=Partition(r,start,end);    //排序并获得轴值
		Quicksort(r,start,pivot-1);      //对轴值左侧递归
		Quicksort(r,pivot+1,end);		//对轴值右侧递归
	}
}

总结

快速排序是众多排序方法中,较为重要的一种,它在排序算法中具有排序速度快,而且是就地排序等优点,使得在许多编程语言的内部元素排序实现中采用的就是快速排序,很多面试题中也经常遇到。

到此这篇关于C++快速排序算法简明理解的文章就介绍到这了,更多相关C++快速排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++使用GDAL库实现Tiff文件的读取

    C++使用GDAL库实现Tiff文件的读取

    这篇文章主要为大家详细介绍了C++使用GDAL库实现Tiff文件的读取的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • c++虚函数与虚函数表原理

    c++虚函数与虚函数表原理

    这篇文章主要介绍了c++虚函数与虚函数表原理,用virtual 修饰的成员函数叫虚函数,下面围绕c++虚函数与虚函数得相关资料展开内容,需要的朋友可以参考一下
    2021-12-12
  • 基于C语言实现的迷宫游戏代码

    基于C语言实现的迷宫游戏代码

    这篇文章主要介绍了基于C语言实现的迷宫游戏代码,对于学习游戏开发的朋友相信有一定的借鉴价值,需要的朋友可以参考下
    2014-08-08
  • C++ 中如何结束 while (cin>>str) 的输入

    C++ 中如何结束 while (cin>>str) 的输入

    这篇文章主要介绍了C++ 中如何结束 while (cin>>str) 的输入,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C语言经典算法例题求100-999之间的“水仙花数”

    C语言经典算法例题求100-999之间的“水仙花数”

    本文的主要内容,设计一个程序,找出100-999之间的“水仙花数”,需要的朋友可以参考下
    2015-07-07
  • C++实现合并排序的方法

    C++实现合并排序的方法

    这篇文章主要介绍了C++实现合并排序的方法,实例分析了合并排序的原理与相关实现技巧,需要的朋友可以参考下
    2015-07-07
  • Qt如何自定义滑动条

    Qt如何自定义滑动条

    这篇文章主要介绍了Qt如何自定义滑动条问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 常用的C语言排序算法(两种)

    常用的C语言排序算法(两种)

    本文给大家分享两种常用的C语言排序算法,代码非常简单,感兴趣的朋友可以参考下
    2016-09-09
  • C语言实现黎曼和求定积分

    C语言实现黎曼和求定积分

    这篇文章主要为大家详细介绍了用C语言程序实现黎曼和求定积分,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 如何使用visual studio2019创建简单的MFC窗口(使用C++)

    如何使用visual studio2019创建简单的MFC窗口(使用C++)

    这篇文章主要介绍了如何使用visual studio2019创建简单的MFC窗口(使用C++),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论