C/C++实现快速排序(两种方式)图文详解

 更新时间:2021年08月13日 14:33:04   作者:你的代码没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语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧
    2018-10-10
  • C++详解如何实现两个线程交替打印

    C++详解如何实现两个线程交替打印

    这篇文章主要介绍了使用C++库实现两个线程交替打印,一个线程打印奇数、一个线程打印偶数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C语言递归实现归并排序详解

    C语言递归实现归并排序详解

    这篇文章主要为大家详细介绍了C语言递归实现归并排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下, 希望能够给你带来帮助
    2022-03-03
  • C++设计模式编程中使用Bridge桥接模式的完全攻略

    C++设计模式编程中使用Bridge桥接模式的完全攻略

    这篇文章主要介绍了C++设计模式编程中使用Bridge桥接模式的完全攻略,Bridge将抽象部分与它的实现部分分离,使它们都可以独立地变化需要的朋友可以参考下
    2016-03-03
  • C语言实现斗地主的核心算法

    C语言实现斗地主的核心算法

    本文给大家分享的是使用C语言实现的斗地主游戏的核心算法,主要实现了面向对象设计,洗牌、发牌、判断牌型、比较牌的大小、游戏规则等算法。通过这个斗地主小项目的练习,提高了我的面向对象设计能力,加深了对算法的理解。最近把这些设计和算法分享给大家。
    2015-03-03
  • 对C语言编程标准以及声明的基本理解

    对C语言编程标准以及声明的基本理解

    这篇文章主要介绍了对C语言编程标准以及声明的基本理解,有助于对C语言编写时的结构有更加清晰的认识,需要的朋友可以参考下
    2015-11-11
  • Qt GUI图形图像开发之Qt表格控件QTableView简单使用方法及QTableView与QTableWidget区别

    Qt GUI图形图像开发之Qt表格控件QTableView简单使用方法及QTableView与QTableWidget区

    这篇文章主要介绍了Qt GUI图形图像开发之Qt表格控件QTableView简单使用方法,需要的朋友可以参考下
    2020-03-03
  • 基于C++实现简单的日期计算机

    基于C++实现简单的日期计算机

    这篇文章主要为大家详细介绍了如何基于C++实现简单的日期计算机,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • c语言多进程tcp服务器示例

    c语言多进程tcp服务器示例

    这篇文章主要介绍了c语言多进程tcp服务器示例,多进程socket,epoll实现IO复用,需要的朋友可以参考下
    2014-03-03
  • 华为面试题数字大小写转换

    华为面试题数字大小写转换

    一个四位数,如1024,1004,打印出他们的中文形式,如果一千零二十四,一千零四,大家参考使用吧
    2013-12-12

最新评论