C/C++实现快速排序算法的两种方式实例

 更新时间:2021年08月12日 09:53:44   作者:你的代码没bug  
快速排序是一种采用分治思想,在实践中通常运行较快一种排序算法,这篇文章主要给大家介绍了关于C/C++实现快速排序的两种方式的相关资料,文中给出了详细的示例代码,需要的朋友可以参考下

介绍

快速排序是对冒泡排序算法的一种改进,快速排序算法通过多次比较和交换来实现排序。

流程如下

(图片来自百度)

实现

以下有两种实现方式,说是两种,其实就是在交换元素时具体细节上有点不同罢了。

方式一

int Partition(int A[],int low,int high){
	int pivot=A[low];//第一个元素作为基准
	while(low<high){
		while(low<high && A[high]>=pivot) high--;
		A[low]=A[high];
		while(low<high && A[low]<=pivot) low++;
		A[high]=A[low];
	} 
	A[low]=pivot;

	return low;
}

void QuickSort(int A[],int low,int high){
	if(low<high){
		int pivotpos=Partition(A,low,high);
		QuickSort(A,low,pivotpos-1);
		QuickSort(A,pivotpos+1,high);
	}
}

该方式,先把基准元素保存起来

如下图数组,把49看作基准元素,先移动high指针,当指向27时退出while循环,把27放到low位置

这时候,high位置就空出来一个,那么让low移动,移动到下图所示时,65>49,退出while循环,再将65放到high位置

这样low这个位置又空出来了,再移动high,如此反复。

最后得到如下图的情况:

这样我们就按照“49”,把数组分为了左右两部分。

对左右两部分分别进行上述操作即可。

方式二

void Quick_sort(int left,int right,int arr[]){
	if(left>=right)return;
	int i,j,base,temp;
	i=left,j=right;
	base=arr[left];
	while(i<j){
		while(arr[j]>=base && i<j)j--;
		while(arr[i]<=base && i<j)i++;
		if(i<j){
			temp=arr[i];
			arr[i]=arr[j];
			arr[j]=temp;
		} 
	}
	arr[left]=arr[i];
	arr[i]=base;
	Quick_sort(left,i-1,arr);
	Quick_sort(i+1,right,arr);
}

对于第二种方式,看下图即可很好理解。

高低指针不是轮流替换空余位置,而是同时找到不符合的元素,然后交换二者。

最后,高低指针相遇,再把基准元素与相遇位置上的元素交换即可。

(以下图片来自网络,侵删)

总结

到此这篇关于C/C++实现快速排序的两种方式的文章就介绍到这了,更多相关C/C++实现快速排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • QString使用正则操作的接口实现

    QString使用正则操作的接口实现

    这篇文章主要介绍了QString使用正则操作的接口实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C语言清楚了解指针的使用

    C语言清楚了解指针的使用

    C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对指针的掌握是非常重要的,本文将具体针对指针的基础做详尽的介绍
    2022-06-06
  • 基于C语言string函数的详解

    基于C语言string函数的详解

    本篇文章是对C语言中string函数进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • linux下c语言中隐藏进程命令行参数(例如输入密码等高危操作)

    linux下c语言中隐藏进程命令行参数(例如输入密码等高危操作)

    启动程序很多时候用命令行参数可以很方便,做到简化一些配置,但是输入用户名密码等操作,如果通过进程查看工具直接看到密码就太不安全了,这里就为大家分享一下方法
    2021-01-01
  • C++实现趣味扫雷游戏

    C++实现趣味扫雷游戏

    这篇文章主要为大家详细介绍了C++实现趣味扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C++ QT智能指针的使用详解

    C++ QT智能指针的使用详解

    这篇文章主要介绍了C++ QT智能指针的使用,Qt是一个跨平台的C++框架,主要用来开发图形用户界面程序,也可以开发不带界面的命令行程序,下面我们来了解QT智能指针是如何使用的
    2023-12-12
  • C++begin和end运算符的返回迭代器的类型如何判断?

    C++begin和end运算符的返回迭代器的类型如何判断?

    今天小编就为大家分享一篇关于C++begin和end运算符的返回迭代器的类型如何判断?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 深入C++ 函数映射的使用详解

    深入C++ 函数映射的使用详解

    我比较喜欢用代码结合实际来讲解,下面我将以一段事例代码来讲解如何使用这几种映射
    2013-07-07
  • C++使用Kruskal和Prim算法实现最小生成树

    C++使用Kruskal和Prim算法实现最小生成树

    这篇文章主要介绍了C++使用Kruskal和Prim算法实现最小生成树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 讲解C++中的枚举类型以及声明新类型的方法

    讲解C++中的枚举类型以及声明新类型的方法

    这篇文章主要介绍了讲解C++中的枚举类型以及声明新类型的方法,是C预言入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09

最新评论