IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构 先进排序 -> 正文阅读

[数据结构与算法]数据结构 先进排序

快速排序

快速排序的基本思想就是通过一趟操作将一个无序的序列分割成相邻的两个区域,其中一个区域中数据的关键字都比另一个区域中的小,(即找到一个枢轴,以其为居中标杆,右边的都比它小,左边的都比它大)。然后对两个区域分别进行这样的操作,直到整个序列呈现有序状态。

对与本算法而言,要调用三个函数。第一个函数int Partition(RcdType R[], int low, int high), 作用是将low...high序列进行一次划分并返回枢轴的位置。具体操作为定义pivotkey,将序列最左边数据关键字赋给它,然后将low的关键字放入R[0] 哨兵单元待定。对于high,如果其关键字比枢轴小,则将其赋给low,对于low,如果其关键字比枢轴大,则将其赋给high,同时注意对其进行自加自减操作,最后当low=high时结束,将R[0]的值赋给low,并返回low。第二个函数,void QSort(RcdType R[], int s, int t),作用是对序列 s...t 进行快速排序。函数体中首先是调用第一个函数对s..t 进行一次划分,然后得到枢轴位置后对左右两边区域递归进行划分,最终实现排序。第三个函数,通过调用第二个函数对顺序表L进行排序。

#include<stdio.h>

/******************************************************************************
							 对记录这个数据类型的定义
******************************************************************************/
typedef int KeyType;
typedef struct {
	KeyType key;
	char data;
}RcdType;

/*******************************************************************************
					  对每一个元素都是记录的顺序表的定义
********************************************************************************/
const int MAXSIZE = 10;
typedef struct {
	RcdType *r;     //r[0]是哨兵单元,不记录数值    r[i]表示记录
	int length;             //表示顺序表的实时长度
}SqList;

/*********************************************************************************
									  建表
**********************************************************************************/
void InitList_L(SqList &L)
{                                     //定义过数据类型后引用时要先给它分配内存空间
	L.r = new RcdType[MAXSIZE + 1];
	L.length = 0;                     //初始化表长为0
}
/********************************************************************************
								 排序
*********************************************************************************/
int Partition(RcdType R[], int low, int high)
{
	//对记录子序列R[low...high]进行一趟快速排序,并返回枢轴记录所在位置
	//使得在它之前的记录的关键字均不大于它的关键字,在它之后的记录的关键字
	//均不小于它的关键字
	int pivotkey;
	R[0] = R[low];   //将枢轴记录移至数组的闲置分量   R[0]是哨兵单元
	pivotkey = R[low].key;    //枢轴记录关键字    相当于把pivotkey指向待处理序列low..high中最左边的low关键字
	while (low < high)        //从表的两端交替地向中间扫描
	{
		while (low < high&&R[high].key >= pivotkey)
			high--;
		if (low < high)     //确保跳出循环时的high关键字比枢轴小
			R[low++] = R[high];   //将比枢轴记录小的记录移到低端
		while (low < high&&R[low].key <= pivotkey) 
			low++;
		if (low < high)
			R[high--] = R[low];  //将比枢轴记录大的记录移到高端
	}
	R[low] = R[0];    //将枢轴记录移到正确位置
	return low;        //返回枢轴位置
}
void QSort(RcdType R[], int s, int t)
{
	//对记录序列R[s..t]进行快速排序
	int pivotloc;
	if (s < t)        //长度大于1;
	{
		pivotloc = Partition(R, s, t);    //对R[s..t]进行一次划分,并返回枢轴位置
		QSort(R, s, pivotloc - 1);        //对低端子序列递归排序
		QSort(R, pivotloc + 1, t);        //对高端子序列递归排序
	}
}
void QuickSort(SqList &L)
{
	//对顺序表L进行快速排序
	QSort(L.r, 1, L.length);
}
void main()
{
	int i;
	SqList L;
	InitList_L(L);
	char a[MAXSIZE] = { 'Y','L','V','X','O','L','!','I','U','E' };
	int key[MAXSIZE] = { 3,5,7,2,6,1,10,4,9,8 };
	for (i = 1; i <= MAXSIZE; i++)
	{
		L.r[i].data = a[i - 1];
		L.r[i].key = key[i - 1];
		L.length++;                 //千万不要忘记每输入一个记录,表长要加一
	}
	printf("排序前顺序表中数据为:");
	for (i = 1; i <= MAXSIZE; i++)
	{
		printf("%c ", L.r[i].data);
	}
	printf("\n");
	QuickSort(L);
	printf("排序后顺序表中数据为:");
	for (i = 1; i <= MAXSIZE; i++)
		printf("%c ", L.r[i].data);

}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-02 15:06:48  更:2021-10-02 15:08:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:20:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码