【数据结构】C语言实现排序算法------快速排序

news/2024/5/19 23:58:25 标签: 数据结构, 快速排序, 排序算法

快速排序:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的数据比另一部分记录的关键字小,则分别可对这两部分数据进行继续排序,以达到整个序列有序。

快速排序有三个版本:

目录

  • 1.hoare版本
  • 2.挖坑法
  • 3.双指针法
  • 4.优化方法

1.hoare版本

示图:

在这里插入图片描述

代码:hoare版本

int _QuickSort_1(int *arr, int left, int right)//hoare版本
{
	int tmp = arr[left];//基准值
	while (left < right)
	{
		while (left < right && tmp < arr[right])
			right--;
		Swap(&arr[left], &arr[right]);
		while (left < right && tmp >= arr[left])
			left++;
		Swap(&arr[left],&arr[right]);
	}
	return left;
}

void QuickSort(int *arr, int left, int right)
{
	if (left >= right)
		return;
	int end = _QuickSort_1(arr, left, right - 1);
	QuickSort(arr, left, end);
	QuickSort(arr, end + 1, right);
}

2.挖坑法

排序需要两个操作:

  1. 数据比较
  2. 数据交换

挖坑法是通过减少对数据的交换来达到排序。

代码:挖坑法

int _QuickSort_2(int *arr, int left, int right)//挖坑法
{
	int tmp = arr[left];
	while (left < right)
	{
		while (left < right && tmp < arr[right])
			right--;
		arr[left] = arr[right];
		while (left < right && tmp >= arr[left])
			left++;
		arr[right] = arr[left];
	}
	arr[left] = tmp;//tmp的值,一定要放到最后的空间中
	return left;
}

void QuickSort(int *arr, int left, int right)
{
	if (left >= right)
		return;
	int end = _QuickSort_2(arr, left, right - 1);
	QuickSort(arr, left, end);
	QuickSort(arr, end + 1, right);
}

3.双指针法

通过设置快慢指针的方法来达到排序。

算法步骤::

  1. 设置两个指针pos,forward
  2. forward处值小于基准值,pos++,如果pos≠forward,将两者值交换
  3. foward处值大于基准值,pos不动
  4. 最后pos的值和起始位置值交换,返回pos

代码:双指针法

int _QuickSort_3(int *arr, int left, int right)//双指针法
{
	int tmp = arr[left];//基准值
	int pos = left;
	int forward = left;
	for (forward; forward <= right; ++forward)
	{
		if (arr[forward] < tmp)//小于是做升序,大于做降序
		{
			pos++;
			if (pos != forward)
			{
				Swap(&arr[forward], &arr[pos]);
			}
		}
	}
	Swap(&arr[left], &arr[pos]);
	return pos;
}

void QuickSort(int *arr, int left, int right)
{
	if (left >= right)
		return;
	int end = _QuickSort_3(arr, left, right - 1);
	QuickSort(arr, left, end);
	QuickSort(arr, end + 1, right);
}

4.优化方法

快速排序有一些待改进的地方。

若:起始位置为最大或者最小时,排序的效率并不高,故采用三路折中法对算法进行改进。

分别对:起始位置,中间位置,末尾位置进行比较,选取中间值进行排序。

int GetMidValue(int *arr, int left, int right)//三路折中法
{
	int mid = (left + right) / 2;
	if (arr[mid] > arr[left] && arr[mid] < arr[right])
		return mid;
	else if (arr[mid] < arr[left] && arr[left] < arr[right])
		return left;
	return right;
}

数据长度在5~25之间的时候,算法效率没有直接插入快(出自殷人昆教授的数据结构教材)。


http://www.niftyadmin.cn/n/1664504.html

相关文章

Java共享内存模型下并发编程问题与分析

系列文章&#xff1a;【并发编程】知识脉络 前言 上一篇文章了解了JMM&#xff1a;JMM是什么&#xff1f;_披甲上战场的博客-CSDN博客 文末提出了这种共享内存的工作模式有哪些隐患&#xff0c;这篇文章来分析。 核心问题 可见性&#xff1a;如何保证某个线程的共享变量副本变…

【数据结构】C语言实现排序算法------归并排序

归并排序&#xff1a;将多个已经有序的序列&#xff0c;合并为一个有序的序列。 算法实现步骤&#xff1a; 需要借助和序列一样长的辅助空间。逐步分割成单个数据分完之后进行合并大的在前、小的在后&#xff08;做升序排序&#xff09; 示图&#xff1a; 代码&#xff1a…

【数据结构】C语言实现排序算法------基数排序

基数排序&#xff1a;借助多关键字排序的思想对单逻辑关键字进行排序的方法。 算法实现的思想如图&#xff1a; 算法的实现&#xff1a; 先统计数字的位数&#xff0c;记为n每次数组值除10^n得到的结果&#xff0c;就将该数值放在该结果上对所有数据做同样的操作&#xff0c;…

散列表(哈希表hash)概述

目录 前言 一、散列表查找定义 1、散列表查找步骤 &#x1f3af;整个散列过程分为两步&#xff1a; 2、Hash冲突 二、散列函数的构造 1、直接定址法 2、数字分析法 3、平方取中法 4、折叠法 5、除留余数法 此方法为最常用的构造散列函数的方法&#xff1a; 6、…

Spring Cloud GateWay网关的具体介绍与使用

前言 网关有以下几个作用&#xff1a; 统一入口&#xff1a;未全部为服务提供一个唯一的入口&#xff0c;网关起到外部和内部隔离的作用&#xff0c;保障了后台服务的安全性。鉴权校验&#xff1a;识别每个请求的权限&#xff0c;拒绝不符合要求的请求。动态路由&#xff1a;…

简洁明了介绍MySQL的索引B+树的数据结构

系列文章&#xff1a;关系型/非关系型【数据库】知识脉络 前言 MySQL的索引数据结构用的BTree道理我都懂&#xff0c;该怎么组织语言呢&#xff1f; 注意简洁明了&#xff01; B树的每个节点中含有多个元素&#xff0c;且分多个叉。B树的叶子结点中元素存储着键&#xff08;…

Java并发编程总结【万字无图纯享版】

前言 总结了一些碎知识点在系列文章&#xff1a;【并发编程】知识脉络 在此总结一篇【并发编程】模块的面试题与答案&#xff0c;纯文字版&#xff0c;不过多讲解&#xff0c;更侧重面试中被问到该如何简洁明了的回答。 欢迎补充问答&#xff01; 1、进程和线程的关系&#xff…

【数据结构】排序算法的实现------(直接插入排序、希尔排序、简单选择排序、堆排、冒泡排序、快排、归并排序、基数排序)

排序&#xff1a;是将一段数据元素(记录)的任意序列&#xff0c;重新排列成一个递增(递减)的有序序列。 目录排序中的概念1.插入排序1.1 直接插入排序1.2 希尔排序2.选择排序2.1 简单选择排序2.2堆排序3.交换排序3.1冒泡排序3.2快速排序4.归并排序5.基数排序6.总结排序中的概念…