快速排序 C语言实现

news/2024/5/20 0:36:03 标签: 数据结构, c语言, 排序算法, 快速排序

快速排序

快速排序(Quick Sort )是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。 如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可能消除多个逆序。

课本上的例子:

在这里插入图片描述
时间复杂度

最好情况:O(n l o g 2 log_2 log2n)
最坏情况:O( n 2 n^2 n2)
平均情况:O(n l o g 2 log_2 log2n)

空间复杂度

O( l o g 2 log_2 log2n)

算法特点:

1)记录非顺次的移动导致排序方法是不稳定的。
2)排序过程中需要定位表的下界和上界,所有适合用于顺序结构,很难用于链式。
3)当n较大时,在平均情况下快速排序是所有内部排序方法中速度最快的一种,所以其适合初始记录无序、n较大时的情况。

完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100  //顺序表最大容量,可以自行加大 

typedef struct 
{
	int key;//关键字项 
	char *otherinfo;//其他数据项 
}ElemType;//记录类型 
typedef struct
{
	ElemType Data[MAXSIZE+1];//静态顺序表的数据域,这里Data[0]为空闲或者为哨兵单元 
	int length;//顺序表的长度 
}SqList;//顺序表 

void InitList(SqList &L)//顺序表的初始化 
{
	L.length = 0;//使顺序表长度归0,便是顺序表的初始化 
}

void CreateList(SqList &L)//顺序表的创建 
{
	printf("请输入:"); 
	while(1)//建立一个死循环,循环终止条件是按了enter键 
	{
		L.length++;//顺序表长度加一 
		if(L.length>MAXSIZE)//判断是否超出最大容纳量 
		{
			printf("顺序表已满!\n");
			return ;
		}
		scanf("%d",&L.Data[L.length].key);//顺序表数据的输入 
		if(getchar() == '\n')//循环终止条件 
			break;
	}
}

void InputList(SqList L)//顺序表的输出 
{
	int i;//记录次数 
	if(L.length == 0)//判断顺序表是否为空 ,若为空结束该函数 
	{
		printf("顺序表是空的!\n");
		return ;
	}
	printf("打印为:");
	for(i=1;i<=L.length;i++)//利用循环打印顺序表中的数据 
		printf("%d ",L.Data[i].key);	
}

int Partition(SqList &L,int low,int high)//对顺序表L中的子表Data[low…high]进行一趟排序,返回驱轴位置 
{
	L.Data[0] = L.Data[low];//用子表的第一个记录做驱轴记录  
	while(low < high)//当low==high时终止循环 ,从表的两端交替地向中间扫描 
	{
		while(low<high&&L.Data[0].key<=L.Data[high].key)
			high--;
		L.Data[low] = L.Data[high];//将比驱轴记录小的记录移到低端 
		while(low<high&&L.Data[0].key>=L.Data[low].key)
			low++;
		L.Data[high] = L.Data[low];//将比驱轴记录大的记录移到高端 
	}
	L.Data[low] = L.Data[0];//驱轴记录到位 
	return low;//返回驱轴位置 
}
int pivotloc;//递归函数中不宜定义变量,故定义一个全局变量 
void QSort(SqList &L,int low,int high)//调用前置初值:low=1;high=L.length; 
{//对顺序表L中的字序列L.Data[low…high]做快速排序,递归算法 
	if(low < high)//长度大于1,递归终止条件 
	{
		pivotloc = Partition(L,low,high);//将L.Data[low…high]一分为二,pivotloc是驱轴位置 
		QSort(L,low,pivotloc-1);//对左子表递归排序 
		QSort(L,pivotloc+1,high);//对右子表递归排序 
	}
}
void QuickSort(SqList &L)//对顺序表L做快速排序 
{
	QSort(L,1,L.length);
}

int main()
{
	SqList L;
	InitList(L);//初始化顺序表 
	CreateList(L);//创建顺序表 
	QuickSort(L);//快速排序 
	InputList(L);//打印排序后结果 
	return 0;
}

在这里插入图片描述
(完)


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

相关文章

js比较和逻辑运算符运算符

比较和逻辑运算符用于测试 true 或 false。 比较运算符 比较运算符在逻辑语句中使用&#xff0c;以测定变量或值是否相等。 给定 x5&#xff0c;下面的表格解释了比较运算符&#xff1a; 运算符描述例子等于x8 为 false全等&#xff08;值和类型&#xff09;x5 为 true&#xf…

简单选择排序 C语言

简单选择排序 &#xff08;Simple Selection Sort&#xff09;也称作直接选择排序。 算法步骤&#xff1a; 1&#xff09; 设待排序的记录存放在数组Data[1…n]中。第一趟从Data[1]开始&#xff0c;通过n-1次比较&#xff0c;从n个记录中选出关键字最小的记录&#xff0c;记…

Azul发布开源工具jHiccup,为Java提供运行时响应时间分析

Azul System公司于12月13日宣称发 布了开源工具jHiccup&#xff0c;设计该工具的目的是对与应用程序底层运行平台相关的暂停和延迟&#xff08;或“hiccups”&#xff09;做出度量。新工具的功能与Azul的 JitterMeter有部分重叠&#xff0c;但它为创建图形化的输出增加了基于Ex…

堆排序 C语言实现

堆排序 (Heap Sort) 是一种树形选择排序&#xff0c;在排序过程中&#xff0c;将待排序的记录Data[1…n]看成是一棵完全二叉树的顺序存储结构&#xff0c;利用完全二叉树中双亲结点和孩 子结点之间的内在关系&#xff0c;在当前无序的序列中选择关键字最大(或最小)的记录。 时…

学习----生活---追寻梦-------

来Lamp兄弟连算下来也有半个月了&#xff0c;对于Lamp这个概念也由当初的陌生变得熟悉起来……更对39期的兄弟当然还有我们班出了名的Shero们啊&#xff01;都变得熟悉起来…..见面总会少不了的hello&#xff0c;少不了的hi…..我英语不好啊~好的话来点英语挺美的。。。呵呵呵。…

归并排序 C语言实现

归并排序 ( Merging Sort )就是将两个或两个以上的有序表合并成一-个有序表的过程。将两个有序表合并成个有序表的过程称为2-路归并&#xff0c;2-路归并最为简单和常用。 算法思想&#xff1a; 假设初始序列含有n个记录&#xff0c;则可看成是n个有序的子序列&#xff0c;每…

资源下载--持续更新中......

下载目录说明&#xff08;如果使用ctrlf查询相应的关键字&#xff09; 一.系统下载 二.LAMP,LNMP软件下载 三.负载均衡软件下载 四.监控软件下载 五.管理软件下载 下面的这个资源连接是存放在我‘云端’的&#xff0c;大家可以直接上去拿 http://sdrv.ms/LnKFi3 &#xff08;如…

java学习笔记(1)--win7 java环境的搭建

java的学习笔记&#xff08;一&#xff09; 搭建java环境 1.下载一个安装程序 需下载一个jdk安装包&#xff0c;JDK&#xff1a;Java开发员的软件开发工具包。 官网网址 https://www.oracle.com/java/technologies/javase-downloads.html 也可以在百度上直接搜。&#xff08…