排序算法-快速排序法(QuickSort)

排序算法-快速排序法(QuickSort)

1、说明

快速排序法是由C.A.R.Hoare提出来的。快速排序法又称分割交换排序法,是目前公认的最佳排序法,也是使用分而治之(Divide and Conquer)的方式,会先在数据中找到一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分。其中小于中间值的数据放在左边,而大于中间值的数据放在右边,再以同样的方式分别处理左右两边的数据,直到排序完为止。操作与分割步骤如下:

假设有n项记录,其键值为。

  1. 先假设K的值为第一个键值。
  2. 从左向右找出键值,使得。
  3. 从左向右找出键值,使得。
  4. 如果,那么与互换,并回到步骤2。
  5. 如果,那么将与互相,并以为基准点分割成左、右两部分,然后针对左、右两边执行步骤1~5,直到左边键值等于右边键值为止。

2、算法分析

  1. 在最好情况和平均情况下,时间复杂度为。在最坏情况下就是每次挑中的中间值不是最大就是最小的,其时间复杂度为。
  2. 快速排序法不是稳定排序法。
  3. 在最坏情况下,空间复杂度为,而在最好情况下,空间复杂度为。
  4. 快速排序法是平均运行时间最快的排序法。

3、C++代码

cpp 复制代码
#include<iostream>
using namespace std;

void Print(int tempData[], int tempSize) {
	for (int i = 0; i < tempSize; i++) {
		cout << tempData[i] << "  ";
	}
	cout << endl;
}

void Quick(int tempData[], int tempLeft, int tempRight) {
	int temp;
	int leftIndex;
	int rightIndex;
	int t;
	if (tempLeft < tempRight) {
		leftIndex = tempLeft + 1;
		rightIndex = tempRight;
		while (true) {
			for (int i = tempLeft + 1; i < tempRight; i++) {
				if (tempData[i] >= tempData[tempLeft]) {
					leftIndex = i;
					break;
				}
				leftIndex++;
			}
			for (int j = tempRight; j > tempLeft + 1; j--) {
				if (tempData[j] <= tempData[tempLeft]) {
					rightIndex = j;
					break;
				}
				rightIndex--;
			}
			if (leftIndex < rightIndex) {
				temp = tempData[leftIndex];
				tempData[leftIndex] = tempData[rightIndex];
				tempData[rightIndex] = temp;
			}
			else {
				break;
			}
		}
		if (leftIndex >= rightIndex) {
			temp = tempData[tempLeft];
			tempData[tempLeft] = tempData[rightIndex];
			tempData[rightIndex] = temp;

			Quick(tempData, tempLeft, rightIndex - 1);
			Quick(tempData, rightIndex + 1, tempRight);
		}
	}
}

int main() {
	const int size = 10;
	int data[100] = { 32,5,24,55,40,81,17,48,25,71 };
	//32  5  24  55  40  81  17  48  25  71
	//32  5  24  25  40  81  17  48  55  71
	//32  5  24  25  17  81  40  48  55  71
	//17  5  24  25  32  81  40  48  55  71
	//5  17  24  25  32  81  40  48  55  71
	//5  17  25  24  32  81  40  48  55  71
	//5  17  25  24  32  71  40  48  55  81
	//5  17  25  24  32  55  40  48  71  81
	//5  17  25  24  32  48  40  55  71  81
	//5  17  25  24  32  40  48  55  71  81
	Print(data, size);
	Quick(data, 0, size - 1);
	Print(data, size);
	return 0;
}

输出结果

相关推荐
笑容掩饰我的失落2 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
旖旎夜光2 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu3 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
Pniubi3 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
普通人63 小时前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
꧁细听勿语情꧂3 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
SomeOtherTime4 小时前
Rust集合(AI回答)
开发语言·后端·rust
曦樂~4 小时前
【Web Development】03JavaScript 基础和事件
开发语言·前端·javascript
郝学胜-神的一滴4 小时前
LangChain Skill 实现(渐进披露 On-Demand Skill,LangChain 官方 Deep Agent Skill 模式)
开发语言·python·langchain·numpy
俊俊几年的4 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c