首页 > 其他分享 >快速排序(C语言)

快速排序(C语言)

时间:2024-03-24 09:29:05浏览次数:19  
标签:right int C语言 while key 排序 快速 left

快速排序(英语:Quicksort),又称分区交换排序,简称「快排」,是一种被广泛运用的排序算法。

快速排序的工作原理是通过分治的方式来将一个数组排序。

快速排序分为三个过程:

  1. 将数列划分为两部分(要求保证相对大小关系);
  2. 递归到两个子序列中分别进行快速排序;
  3. 不用合并,因为此时数列已经完全有序。

对于完成一个快排函数,需要传入的参数分别是需要排序的数组a,最左边数据的下标以及最右边数据的下标


这里先介绍这一种方法:交换法,而实现交换的函数比较简单,这里不过多赘述。

void Swap(int* a,int* b) {
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

这一方法的过程是:

先right从右向左开始遍历,right向左走,如果遇到比a[key]更加小的值就停下来;

再left从左向右开始遍历,left开始向右走,相反在遇到比a[key]更加大的值就停下来;

将数组中的两个值作交换;

right再重新开始继续向左走,不断重复这一过程直到二者相遇;

相遇后将相遇处数组的值与a[key]交换,同时将key的值改为相遇处的下标;

向下递归。

如图,举个简单的例子。

void QuickSort(int* a, int left, int right) {

	if (left >= right) {//放在最前
		return; 
 	}
	int begin = left, end = right;//left与right 会被改变,用两个变量保留它们的值用于接下来的递归

	int key = left;

	while (left < right) {

		while (left < right && a[right] >= a[key]) {
			right--;
		}
		 
		while (left < right && a[left] <= a[key]) {
			left++;
		}
		Swap(&a[left], &a[right]);

	}

	Swap(&a[left], &a[key]);
	key = left;

	QuickSort(a, begin, key - 1);
	QuickSort(a, key + 1, end);
}

在测试一下结果:

没有问题。

(本人资历尚浅,如果文中有任何问题,劳请指出。)

标签:right,int,C语言,while,key,排序,快速,left
From: https://blog.csdn.net/2302_80190174/article/details/136976385

相关文章

  • 036—pandas 按行将列名根据值由大到小排序
    前言数据处理中,按行排列的列名可以提供更直观的数据探索和分析方式。你可以逐行查看列名,了解每列的含义和特征,有助于更好地理解数据集的结构和内容。需求:需要增加一列「分布方式」,每行的值是本行基金名称对应列名及数量,顺序按照值大小,值为0的不显示思路:先用apply(......
  • # c语言程序设计——实验报告二
    实验项目名称:实验报告2数据描述实验项目类型:验证性实验日期:2024年3月21日一、实验目的1、掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。2、掌握不同数据类型之间赋值的规律。3、学会使用C的有关算术运算符,以及包含这些运算符的......
  • C语言作业(二)
    1.在数组中查找某个数字#include<stdio.h>intmain(){intarr[]={1,2,3,4,5,6,8,9,10,11};intk=7;intsz=sizeof(arr)/sizeof(arr[0]);//求解数组的元素个数intleft=0;intright=sz-1;while(left<=right){......
  • C语言作业(五)
     1.逆序字符串函数//写一个函数,来逆序一个字符串的内容#include<stdio.h>#include<string.h>#include<assert.h>voidreverse(char*str){assert(str);//保证指针的有效性intlen=strlen(str);char*left=str;//left指针指向第一个字符char*......
  • # c语言程序设计——实验报告一
    实验项目名称:实验一熟悉C语言运行环境实验项目类型:验证性实验日期:2023年3月14日一、实验目的下载安装Devc6.0程序。了解在该系统上如何进行编辑、编译、连接和运行一个C程序。通过运行简单的C程序了解C程序的特点。二、实验硬、软件环境Windows计算机、Devc6.0三、......
  • C语言for循环详细讲解
    引言:在上一篇博客中,我们介绍了关于C语言的一种循环,while循环,并介绍了其中的关键字及其例题,在本片帖子,我们将引入一种新的循环方式,名为for循环,那么它与while循环又有哪些相似之处和不同之处呢?让我们一起来探索一下。一.for循环的基本架构for循环时三种循环中使用最多的for循......
  • 中考英语首字母快速突破014-2021上海徐汇英语二模-Future Changes: Predictions and P
    PDF格式公众号回复关键字:ZKSZM014原文​Readthecommentsaboutchangesinthefuture.Howmuchdoyouagreewiththem?​Thedays,somepeopleworkathomeoneortwodaysaweekinsteadofgoingtoanofficeeveryday.Ithinkinthefuture......
  • LaTex学习实践(简易快速LaTex上手例子)
    目录前言正文完全参考前言这篇博客完全是博客https://blog.csdn.net/NSJim/article/details/109066847?spm=1001.2014.3001.5506的实践产物因为写的太好了,所以我进行了实践(overleaf平台)所有的代码和图片我已上传,下载后,上传到自己的overleaf平台即可编......
  • 快速上手 Vue.js 框架:初学者指南
    快速上手Vue.js框架:初学者指南Vue.js是一个轻量级且灵活的JavaScript框架,专为构建交互式的Web界面而设计。它的设计哲学是使得开发者可以轻松上手,同时提供强大的功能来构建复杂的单页应用(SPA)。如果你是前端开发的新手,或者想要学习一种新的框架来提升你的技能,那么Vu......
  • 【算法】冒泡、选择和插入排序
    目录1.简介2.冒泡排序2.1步骤2.2C语言编码3.选择排序步骤C语言编码4.插入排序步骤C语言编码1.简介在经典排序算法中排序算法平均时间复杂度最好情况最坏情况空间复杂度排序方式稳定性冒泡排序O(n2)O{\left(n^{2......