快速排序(quick sort) C ~

news/2024/5/19 22:49:46 标签: 快速排序, C语言

快速排序性能好坏主要在于主元的选取。

下面 有两种选主元的方式:

(1) : 每次选取当前序列的第一个元素

(2):选取选取当前序列的 首元素、 中间元素 、 尾元素 的 中位数.

核心 : 每次 给主元找到准确的排序位置(效率高的原因也就在于每次找的的都是准确的位置)。

(1) 选取首元素为基准(主元)的实现:

#include<stdio.h>
int a[101];

void sort(int a[], int left, int right)
	{
		int i, j;
		int tmp;
		if(left > right)
			return ;
		tmp = a[left];
		i = left;
		j = right;
		int t;
		while(i != j){
			while(a[j] >= tmp && i < j)
				j--;
			while(a[i] <= tmp && i < j)
				i++;
			t = a[j];
			a[j] = a[i];
			a[i] = t;		
		}
		a[left] = a[j];
		a[j] = tmp;
		sort(a, left, j-1);
		sort(a, j+1, right);
	}
void quick_sort(int a[], int n)
	{
		sort(a, 0, n-1);		
	}	
	
int main()
	{
		int n, i;
		scanf("%d",&n);
		for(i = 0; i < n; i++ ){
			scanf("%d",&a[i]);
		}
		quick_sort(a, n);
		for(i = 0; i < n; i++ ){
			printf("%d ", a[i]);
		}
		return 0;
	}

(2)选取中位数为基准数据的实现:

#include<stdio.h>
#define MAX 100
void swap(int *a, int *b)
	{
		int tmp;
		tmp = *a;
		*a = *b;
		*b = tmp;
	}
int get_pivot(int a[], int left, int right) //选 主元  就是把 left, right , mid 按照从小到大排序 并把 中间值 返回当做主元
	{
		int mid = (left + right)/2;
		if(a[left] > a[mid])
			swap(&a[left], &a[mid]);
		if(a[left] > a[right])
			swap(&a[left], &a[right]);
		if(a[mid] > a[right])
			swap(&a[mid], &a[right]);
		swap(&a[left], &a[mid]);
		return a[left];				
	}	
void sort(int a[], int left, int right)
	{
		if(left > right) //不能少 
			return ;
		int pivot = get_pivot(a, left, right);
		int i, j;
		i = left;
		j = right;
		
		while(i != j){
			while(a[j] >= pivot && i < j)//主语 这两个while语句的顺序 很重要 不能调换
				j--;
			while(a[i] <= pivot && i < j)// 主元选取在left 则每次必须是从right端 开始 查询 也就是 j先-- 找合适的
				i++;		     //然后在i++  (位置不可调换)
			if(i < j)	
				swap(&a[i], &a[j]);	
		}
		//出来时一定是 i == j 
		swap(&a[j], &a[left]); //找到 主元的合适位置
		sort(a, left, j-1);//递归 处理左半边
		sort(a, j+1, right);//递归处理右半边
		
		return ;		 
	}	
void quick_sort(int a[], int n)//提供 优雅的 接口
	{
		sort(a, 0, n-1);	
	}	
	
int main()
	{
		int a[MAX];
		int n, i;
		scanf("%d",&n);
		for(i = 0; i < n ; i++ ){
			scanf("%d",&a[i]);
		}
		quick_sort(a, n);
		for(i = 0; i < n; i++ ){
			printf("%d ",a[i]);
		}
		
		return 0;
	}






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

相关文章

用 R 进行高频金融数据分析简介

作者&#xff1a;李洪成 摘自&#xff1a;http://cos.name/wp-content/uploads/2013/11/ChinaR2013SH_Nov03_04_LiHongcheng.pdf 高频数据 金融市场中&#xff0c;逐笔交易数据&#xff08;transaction by transaction data) 或逐秒记录数据 (tick by tick data) 被称为高频数据…

好冷的Python~默认参数、可变对象和不可变对象

原文链接&#xff1a;http://www.juzicode.com/archives/3402 昨天有个小伙伴给桔子菌留言发来一段代码&#xff0c;疑惑为什么没有得到他预期的结果&#xff0c;桔子菌把代码简化之后是这个样子的&#xff1a; def foo(x,l[]):l.append(x)return la foo(1) b foo(2) print…

Flutter移动应用开发实战——元数据

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

Linux command CAT

cat主要有三大功能&#xff1a;1.一次显示整个文件。$ cat filename2.从键盘创建一个文件。$ cat > filename 只能创建新文件,不能编辑已有文件.3.将几个文件合并为一个文件&#xff1a; $cat file1 file2 > file参数&#xff1a;-n 或 --number 由 1 开始对所有输出的行…

ElasticSearch嵌套模型基本操作

上篇介绍了ES嵌套模型使用场景和优缺点&#xff0c;本篇接着介绍关于ES嵌套的索引一些基本的操作&#xff0c;包括插入&#xff0c;追加&#xff0c;更新&#xff0c;删除&#xff0c;查询单独放下一篇文章介绍。 首先来看下如何添加数据&#xff0c;上篇提到了我们项目中有三个…

数据可视化~matplotlib显示二维图像

原文链接&#xff1a;http://www.juzicode.com/archives/2514 matplotlib中显示二维图像不再使用plot()方法&#xff0c;而是有专用的api接口imshow()&#xff0c;接受二维数组和特定形状的三维数组&#xff0c;如果是三维数组第三维是3或者4&#xff0c;3正好对应rdb三通道彩…

Flutter移动应用开发实战——注释

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

TTTTTTTTTTTTT LA 2191 树状数组 稍修改

题意&#xff1a;给出n个数字&#xff0c;操作有修改&#xff08;S&#xff09;和输出区间和(M)。 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queu…