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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法---分治策略(快排) -> 正文阅读

[数据结构与算法]算法---分治策略(快排)

分治策略之快速排序

快速排序是对冒泡排序算法的一种改进,快速排序在面试过程中被提到的概率还是很大的,本文章我将介绍一下有关快速排序的一些问题。

算法思想

(1)指定一个定界值,通过该值会将数组分成两部分
(2)将大于定界值的数据都放在右边,小于等于定界值的数据都放在左边,此时,以定界值为中心,左边全部都是小于等于定界值的数,右边全部都是大于定界值的数
(3)将左边的数据拿出来,又重新找一个定界值,重复上面的操作。右边的值也是相同的操作。
(4)可见,上面的操作是一个递归的过程,等左右两边的数据都进行完毕,即数组中的数据已经有序

eg:

矩形:定界值
线段:下一趟要进行快排的子序列
在这里插入图片描述

代码展示

递归方式

#include<stdio.h>
#include<assert.h>

int Parition(int* ar, int left, int right)
{
	int tmp = ar[left];
	while (left < right)
	{
		while (left < right && tmp < ar[right])
		{
			--right;
		}
		if(left < right)ar[left] = ar[right];
		while (left < right && ar[left] <= tmp)
		{
			++left;
		}
		if(left < right)ar[right] = ar[left];
	}
	ar[left] = tmp;
	return left;
}

void QuickPass(int* ar, int left, int right)//递归方式的快排
{
	if (left < right)
	{
		int  pos = Parition(ar, left, right);
		QuickPass(ar, left, pos - 1);
		QuickPass(ar, pos + 1, right);
	}
}

void QuickSort(int* ar, int n)
{
	assert(ar != NULL);
	QuickPass(ar, 0, n - 1);
}

非递归方式

#include<stdio.h>
#include<assert.h>
#include<stack>//c++中的栈
#include<queue>//c++中的队列

void NiceQuickSort_stack(int* ar, int n)//非递归用栈的方式
{
	assert(ar != NULL);
	stack<int> ist;
	ist.push(0);
	ist.push(n - 1);
	while (!ist.empty())
	{
		int right = ist.top(); ist.pop();
		int left = ist.top(); ist.pop();
		int pos = Parition(ar, left, right);
		if (left < pos - 1)
		{
			ist.push(left);
			ist.push(pos - 1);
		}
		if (pos + 1 < right)
		{
			ist.push(pos + 1);
			ist.push(right);
		}
	}
}

void NiceQuickSort_queue(int* ar, int n)//非递归用队列的方式
{
	assert(ar != NULL);
	queue<int> ist;
	ist.push(0);
	ist.push(n - 1);
	while (!ist.empty())
	{
		int left = ist.front(); ist.pop();
		int right = ist.front(); ist.pop();
		
		int pos = Parition(ar, left, right);
		if (left < pos - 1)
		{
			ist.push(left);
			ist.push(pos - 1);
		}
		if (pos + 1 < right)
		{
			ist.push(pos + 1);
			ist.push(right);
		}
	}
}

总结

快速排序的缺点:
1.越有序越慢,完全有序则为O(n^2);
2.空间复杂度为O(logn)不是O(1);3.不稳定;

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 14:04:31  更:2021-10-07 14:04:38 
 
开发: 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年5日历 -2024/5/17 14:38:25-

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