C语言-快速排序算法-原理-详解(完整代码)

2023-11-03

目录

原理:

思想

代码:

快排代码详解:

执行结果


原理:

先选择一个数作为 基准值 (这里用的是 第一个数),进行一次排序
然后将所有比'基准值小的数'放在基准值的'左边',
将所有比'基准值大的数'放在基准值的'右边',

然后再对两边的,各自'再取一个数作为基准值',然后再次排序递归[自己调自己])

思想

通过一个基准值,把一组数据分成两个部分(一边小,一边大),然后,在对两个部分,分别找一个基准值再次进行排序直至每一个小部分不可再分,所得到的整个数组就成为了有序数组。

代码:

#include <stdio.h>
#include <stdlib.h>

#define  N  10

//快速排序法
int quick_sort(int *a, int low, int high)
{
	int i = low;	//第一位
	int j = high;	//最后一位
	int key = a[i]; //将第一个数作为基准值-- 先找到一个基准值

	while (i < j)
	{					
		while(i < j && a[j] >= key)
		{
			j--;
		}
		a[i] = a[j];	

		while(i < j && a[i] <= key)
		{
			i++;
		}
		a[j] = a[i];
	}
	a[i] = key;
	if (i-1 > low) 
	{
		quick_sort(a, low, i-1);
	}

	if (i+1 < high)
	{
		quick_sort(a, i+1, high);
	}

	return 0;
} 

//程序的入口
int main(int argc, const char *argv[])
{
        //先整了个数组,初始化了一堆数,一共十个,N 宏定义了 10	
        int a[N] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0}; 

	int i = 0;
	printf("排序之前:\n");
	for(i = 0; i < N; i++)
	{
		printf("%d ", a[i]);
	}
	putchar(10);//换行

	//调用-快排
	quick_sort(a, 0, N-1);//数组,0 ,9
	
	printf("排序之后:\n");
	for(i = 0; i < N; i++)
	{
		printf("%d ", a[i]);
	}
	putchar(10);
	
	return 0;
}

快排代码详解:

#include <stdio.h>
#include <stdlib.h>

#define  N  10

//快速排序法
int quick_sort(int *a, int low, int high)
{
	int i = low;	//第一位
	int j = high;	//最后一位
	int key = a[i]; //将第一个数作为基准值-- 先找到一个基准值

	//进行排序---> 最终结果就是 左面的 都比基准值小 ,右面的都比 基准值大,所以这是所有循环的结束条件
	while (i < j)
	{
		//下面的循环执行的条件是 如果右面的比基准值大,就赋一下值,否则继续向前移动
                //---如果直接把循环写成下面这样---
		//while(a[j] >= key) //如果下面的不写这个i<j,这个就出错、越界,并且排序不准--理由:
		//如果i<j,并且: 右面的值 大于 基准值 时,j往前移动一个
					//i 跟 j 的可能情况 只有 i<j i==j
		while(i < j && a[j] >= key)//i<j 是 当前while循环的结束条件,如果没有这个,i会大于j,出现越界,错误 
		{
			j--;//继续走
		}//如果不成立,也就是 a[j] <= key;右面的比key小了,那就换个位置
		//把a[j]的数据给a[i]	
		a[i] = a[j];	

		//将事先保存好的基准值与左边的值进行比较,如果基准值大,保持不变,i往前
		//然后 判断一下这个新的a[i],也就是之前的a[j]跟key值的关系---> 一定是 a[i]<key
		//所以把i向前移动一下,i++
		while(i < j && a[i] <= key)
		{
			i++;
		}
		//移动完以后,把新的位置的a[i]的数值 给刚才的 a[j],然后开始下一次循环
		a[j] = a[i];
	}

	//跳出循环,将基准值放入数据a[i]中
	a[i] = key;
	//对基准值左边 的所有数据 再次进行快速查找(递归)
	if (i-1 > low) 
	{
		quick_sort(a, low, i-1);
	}

	//对基准值右边的所有数据再次进行快速查找(递归)
	if (i+1 < high)
	{
		quick_sort(a, i+1, high);
	}

	return 0;
} 

int main(int argc, const char *argv[])
{
	int a[N] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0};//先整了个数组,初始化了一堆数	

	int i = 0;
	printf("排序前:\n");
	for(i = 0; i < N; i++)
	{
		printf("%d ", a[i]);
	}
	putchar(10);

	//调用-快排
	quick_sort(a, 0, N-1);//数组,0 ,9
														
	printf("排序后:\n");
	for(i = 0; i < N; i++)
	{
		printf("%d ", a[i]);
	}
	putchar(10);
	
	return 0;
}

执行结果

如果有重复的数据也可以

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言-快速排序算法-原理-详解(完整代码) 的相关文章

随机推荐

  • python中pydantic库

    文章目录 pydantic库详解 一 概述 1 简介 2 优势 3 环境配置 二 Model 1 模型属性 2 基本使用 3 数据导入 3 1 orm 3 2 pickle 3 3 json 4 数据导出 三 验证器 1 类内添加 2 重用
  • C# 系统应用之清空回收站操作

    由于毕业设计项目是基于U盘防御的软件 所以涉及些系统应用的知识 本文主要讲述的是如何通过C 代码实现清空回收站的资源 主要通过SHEmptyRecycleBin函数实现 一 SHEmptyRecycleBin函数 SHEmptyRecycl
  • qmake 设置动态链接库的加载路径 rpath

    在项目的 pro文件中添加以下代码 注意位置尽量靠前 QMAKE LFLAGS Wl rpath ORIGIN QMAKE LFLAGS Wl rpath ORIGIN lib QMAKE LFLAGS Wl rpath ORIGIN li
  • 《Effective C++》读书笔记

    Effective C 的目录方便回顾 1 视c为一个语言联邦 2 尽量以constenuminline替换 define 3 尽可能使用const 4 确认对象被使用前已先被初始化 5 了解c默默编写并调用了哪些函数 6 若不想使用编译器
  • 不平衡数据分类方法

    仅个人学习时 阅读相关资料总结 可能有部分不准确 概述 定义 数据不平衡分类是对各类别间样本的数目相差较大的数据集进行分类 例如 二分类问题中 一个样本总数为100 80个样本被标为类别1 剩下的20个样本被标为类别2 类别1比类别2的样本
  • python高性能调用js

    转载于 微信公众号 爬虫黑科技 做js逆向 一般是将js的加解密的源码抽出来然后用python的pyexecjs包来调用 但这样的话会有一部分性能丢失 这里推荐一种http调用方式 1 将js的加解密入口封装成一个函数 例如 functio
  • Linux Ubuntu 虚拟机不能连网、Linux Ubuntu 虚拟机怎么连网

    主机与虚拟机文件传递移步 https blog csdn net qq 38786209 article details 79984879 notice 虚拟机不能上网 可能会有很多原因 但是如果没有特殊要求 只是想尽快连上网使用的话 推荐
  • 二叉树的优点和缺点

    二叉树的优点和缺点 二叉排序树是一种比较有用的折衷方案 数组的搜索比较方便 可以直接用下标 但删除或者插入某些元素就比较麻烦 链表与之相反 删除和插入元素很快 但查找很慢 二叉排序树就既有链表的好处 也有数组的好处 在处理大批量的动态的数据
  • CCF-CSP 202209-1 如此编码

    该题主要理解题意 首先a数组已经给你了 c数组是可以自己求出的 再按照提示所给的公式就可以很容易地求出每个b了 include
  • 地图地址转经纬度,js没加载完进行调用了高德地图的api报错处理

    传给后端需要转化成经纬度 版本问题下面代码v 1 3 使用外链加载地图js
  • python中添加进度条----trange的使用

    今天抓取某个平台数据时有个参数需要生成 因此加了个trange 对抓取添加进度条能更加直观的看到生成了多少 如图所示 添加了进度条以后看到进度就更直观了 那么这个操作是如何实现的呢 这就要提到python中的trange函数了 很简单 1
  • Redis研发实践

    author skate time 2018 12 22 1 设计规范的key名 1 建议 可读性和可管理性 以业务名 或数据库名 为前缀 防止key冲突 用冒号分隔 比如业务名 表名 id 一般redis Key需要能明显的看出该类型存储
  • 【GPU高性能编程 CUDA实战】学习笔记

    CUDA By Example an Introduction to General Purpose GPU Programming 第1章 为什么需要CUDA 第2章 入门 第3章 CUDA C 第4章 CUDA C并行编程 第5章 线程
  • Windows运行python

    windows运行py文件的方法 1 通过powershell打开 当前文件夹空白的地方 shift 右键 选择powershell选项 python 按tab选择你要运行的文件 2 通过地址栏打开 在当前文件夹地址栏上方 输入cmd 回车
  • 那些年在Opencv遇到过的Mat坑

    本文记录一些遇到过的Mat坑 以及易淆的知识点 1 热身 Mat成员之易淆 a Mat depth depth 得到的是一个0 6的数字 分别代表单个图不同的深度 对应关系如下 C1 C2 C3 C4 C 5 C 6 C 7 C 8 CV
  • 使用pd.io.sql.to_sql 将数据导入到mysql数据库

    首先导入需要的包 导入需要的包 import pandas as pd import sqlalchemy import create engine 初始化数据库 导入数据 db info user root password 123456
  • 【fly-iot飞凡物联】(12):EMQX 5.1使用docker 本地部署,接入到Actorcloud的数据库中,成功连接创建的设备,可以控制设备访问状态

    目录 前言 1 关于 2 使用docker 进行部署 3 配置API key 可以使用接口访问的 4 设置客户端认证 连接PostgreSQL 数据连接 5 使用客户端进行连接 6 EMQX的API 接口地址 7 总结 前言 本文的原文连接
  • 华为OD机试真题 Java 实现【跳格子2】【2023 B卷 100分】,附详细解题思路

    一 题目描述 小明和朋友玩跳格子游戏 有n个连续格子组成的圆圈 每个格子有不同的分数 小朋友可以选择从任意格子起跳 但是不能跳连续的格子 不能回头跳 也不能超过一圈 给定一代表每个格子得分的非负整数数组 计算能够得到的最高分数 二 输入描述
  • MATLAB2016b 下载,破解,安装

    MATLAB2016下载地址 包含安装教程 链接 https pan baidu com s 1gvYOii0Db5tHMV3blSb w 密码 zq6i 解压破解文件夹密码 rjzkgzh MATLAB C盘的安装路径 C Program
  • C语言-快速排序算法-原理-详解(完整代码)

    目录 原理 思想 代码 快排代码详解 执行结果 原理 先选择一个数作为 基准值 这里用的是 第一个数 进行一次排序 然后将所有比 基准值小的数 放在基准值的 左边 将所有比 基准值大的数 放在基准值的 右边 然后再对两边的 各自 再取一个数