排序算法之快速排序(挖坑法)

挖坑法的思想:记第一个数为key,要调整key的位置,使得左边的都要比key的小,右边的数都比key的大。

记录下关键字key==begin,把28那个位置挖坑hole==begin

让end找到小于28(key)的数,把那个数放到hole坑中,然后让hole==end

再从左边begin找大于28(key)的数,把那个数放在hole中,然后让hole==begin

结束条件begin>=end调出循环。然后arr[hole]=key;

完成一趟的调整。

//一趟挖坑
int arr[]={5,3,2,6,7,4,9};
int n=sizeof(arr)/sizeof(arr[0]);
int begin=0;
int end=n-1;
while(begin<end)
{while(begin<end&&arr[end]>=key){end--;}arr[hole]==arr[end];hole==end;while(begin<end&&arr[begin]<=key){begin++;}arr[hole]==arr[begin];hole=begin;
}
arr[hole]==key;

再分治思想,分成左边和右边。

用到分治递归,就要改变函数的参数,要有left和right

你们以为这样子快排就无敌了吗?不!当key每次取到的数都是最小或者最大,(也就是数组有序的情况下)它的时间复杂度会达到O(N^2)

那要怎么优化呢?三数取中法,就是创建一个函数,比较left,right,mid三个数,取大小是中等的数。然后把中等大小的数的下标返回出来,出来之后与begin(left)交换,为了确保不大改动原代码。

//三数取中
int GetMidIndex(int* a, int left,int right)
{int mid = (left + right) / 2;if (a[mid] > a[left]){if (a[mid] <= a[right]){return mid;}if (a[mid] > a[right]){if (a[right] >= a[left]){return right;}else{return left;}}}if(a[mid]<=a[left]){if (a[left] <= a[right]){return left;}if (a[left] > a[right]){if (a[right] > a[mid]){return right;}else{return mid;}}}
}

整体的代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int GetMidIndex(int* a, int left,int right)
{int mid = (left + right) / 2;if (a[mid] > a[left]){if (a[mid] <= a[right]){return mid;}if (a[mid] > a[right]){if (a[right] >= a[left]){return right;}else{return left;}}}if(a[mid]<=a[left]){if (a[left] <= a[right]){return left;}if (a[left] > a[right]){if (a[right] > a[mid]){return right;}else{return mid;}}}
}
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
//1.挖坑法的快速排序
void QuickSort(int* a,int left,int right)
{if (left >= right)//不能写成pivot==left,pivot-1与left不匹配,会报错{return;}int index = GetMidIndex(a, left, right);Swap(&a[index], &a[left]);int begin = left,end = right;int key = a[begin];//挖了一个关键字int pivot = begin;//挖了一个坑while (begin < end){//右边找小,一定要先右边找小,放在pivotwhile (begin < end&&a[end] >= key)//在这里也要判断begin < end,因为这里面end--{end--;}//小的放在左边的坑里,然后形成新的坑位a[pivot] = a[end];pivot = end;//左边找大while (begin < end && a[begin] <= key){begin++;}a[pivot] = a[begin];pivot = begin;	}//begin==end	a[pivot] = key;//[left,right]//[left,pivot-1]  pivot  [pivot+1,right]//如果左子区间和右子区间都有序,就全部有序。那就分治递归。QuickSort(a, left, pivot - 1);QuickSort(a, pivot+1, right);
}
void PRINT(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);} 
}
int main()
{int arr[] = { 5,6,8,9,3,1,4,7,5,1 };int n = sizeof(arr) / sizeof(arr[0]);QuickSort(arr, 0,n-1);PRINT(arr,n);return 0;
}

注意:在QuickSort函数中,取到中等值的下标的时候,把中等值的位置与最左边的值交换一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/504419.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文笔记】Dynamic Occupancy Grids for Object Detection: A Radar-Centric Approach

原文链接&#xff1a;https://arxiv.org/abs/2402.01488 I. 引言 感知环境在自动驾驶中非常重要&#xff0c;但传统的方法将这一过程分为两方面&#xff1a;动态物体的检测和跟踪&#xff0c;以及使用占用网格表达静态环境。占用网格难以表达高度动态的物体&#xff0c;因此动…

前端Vue3项目如何打包成Docker镜像运行

将前端Vue3项目打包成Docker镜像并运行包括几个主要步骤&#xff1a;项目打包、编写Dockerfile、构建镜像和运行容器。下面是一个基本的流程&#xff1a; 1. 项目打包 首先&#xff0c;确保你的Vue3项目可以正常运行和打包。在项目根目录下执行以下命令来打包你的Vue3项目&am…

OSI七层模型/TCP四层模型

协议&#xff1a; 协议是双方共同指定的一组规则&#xff0c;在网络通信中表示通信双方传递数据和解释数据的一组规则。 从A上传文件到服务器B,需要在A和B之间制定一个双方都认可的规则&#xff0c;这个规则就叫文件传输协议&#xff0c;该协议是ftp协议的一个初级版本&#…

知识图谱1——neo4j

2024年要搞知识图谱&#xff0c;因此没有办法&#xff0c;只能将我之前固守的JDK1.8&#xff0c;升级到JDK21&#xff0c;因为JDK21也是LTS版本&#xff0c;neo4j高版本就不支持JDK8&#xff0c;因此没有办法&#xff0c;只有升级了。写这篇只是一个搭建笔记&#xff0c;我的初…

数据开发必知必会 - 数据仓库理论总结

一、数据仓库特点(4个特点) 1.1、数据仓库是面向主题的 1.2、数据仓库是集成的 1.3、数据仓库的数据是稳定的 1.4、数据仓库中的数据是随时间变化而变化的 二、数据仓库分层(特点or意义) 2.1、把复杂问题简单化 2.2、减少重复开发 2.3、隔离原始数据 三、数据仓库核心…

c语言经典测试题10

1.题1 int fun( int x) {int n 0;while (x 1){n;x x | (x 1);}return n; } int main() {int ret fun(2014);printf("%d", ret);return 0; } 上述代码运行结果是什么呢&#xff1f; 我们来分析一下&#xff1a;这里的fun函数有一个while循环&#xff0c;其判断…

详解队列的接口函数

队列的定义 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。 进行插入操作的…

CleanMyMac X2024免费Mac电脑清理和优化工具

CleanMyMac X是一款专业的 Mac 清理和优化工具&#xff0c;它具备一系列强大的功能&#xff0c;可以帮助用户轻松管理和维护他们的 Mac 电脑。以下是一些关于 CleanMyMac X 的主要功能和特点&#xff1a; 智能清理&#xff1a;CleanMyMac X 能够智能识别并清理 Mac 上的无用文件…

AJAX实例

AJAX - Asynchronous JavaScript and XML - 异步的JavaScript与XML&#xff0c;不是一门新技术&#xff0c;只是一个新的术语。&#xff08;老技术新玩法&#xff09; - 使用AJAX&#xff0c;网页能够将增量更新呈现在页面上&#xff0c;而不需要刷新整个页面。 - 虽然X代表…

考研机试C++题目精选

更多内容会在godownio.github.io更新 算法练习&#xff08;C代码&#xff09; 考研上机或C语言代码笔试准备&#xff0c;暨大机试原题letcode牛客中南大等高校机试 快速幂算法 题目&#xff1a;输入一个整数 n &#xff0c;求 n^n 的个位数是多少。 快速幂算法&#xff1a;…

初识C语言—常见关键字

变量的命名最好有意义 名字必须是字母&#xff0c;数字&#xff0c;下划线组成&#xff0c;不能有特殊字符&#xff0c;同时不能以数字开头 变量名不能是关键字 typedef---类型定义&#xff0c;类型重命名 #include <stdio.h>typedef unsigned int uint; //将unsigne…

第七十二天 漏洞发现-Web框架中间件联动GobyAfrogXrayAwvsVulmap

第72天 漏洞发现-Web框架中间件&联动&Goby&Afrog&Xray&Awvs&Vulmap 知识点&#xff1a; 1、Bup简单介绍&使用说明 2、Xray简单介绍&使用说明 3、AWWS简单介绍&使用说明 4、Goby简单介绍&使用说明 5、Afrog简单介绍&使用说明 6、…