博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试笔记 | 排序算法
阅读量:3788 次
发布时间:2019-05-22

本文共 2503 字,大约阅读时间需要 8 分钟。

目录

排序算法

在这里插入图片描述

在这里插入图片描述

01 堆排序

  • 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
  • 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
    在这里插入图片描述

02 快速排序

在这里插入图片描述

快速排序思想:

  1. 选择数组左边第一个元素为枢轴pivot,把数组所有元素比pivot大的放在数组右边,比pivot小的放在左边。(复杂度为O(n)
  2. pivot左右两边的序列分别进行快速排序。

平均时间复杂度分析:

T(1) = 1;	T(n) = 2*T(n/2) + a*n;(a为常数,每次合并时,复杂度为O(n))	= 2*(2*T(n/4)+a*n/2) + a*n	= 4*T(n/4) + 2*a*n	= 4*(2*T(n/8)+a*n/4) + 2*a*n	= 8*T(n/8) + 3*a*n	=......	= 2^k*T(1) + k*a*n  (其中n==2^k,即k=log2(n))	= n + a*n*log2(n);

所以时间复杂度为O(nlogn)

  • 注意:对左右分别快排时,可能出现一遍元素个数为0,这是最坏情况,此时时间复杂度为O(n^2)
#include 
using namespace std;#include
void quicksort(vector < int > & nums, int low, int high) {
if (low < high) {
int i = low; int j = high; int tmp = nums[low]; while (i < j) {
while (i < j && nums[j] > tmp) {
j--; } if (i < j) {
nums[i] = nums[j]; } while (i < j && nums[i] <= tmp) {
i++; } if (i < j) {
nums[j] = nums[i]; } } nums[i] = tmp; quicksort(nums, low, i - 1); quicksort(nums, i + 1, high); }}int main() {
int n; cin >> n; vector < int > nums(n); for (int i = 0; i < n; i++) {
cin >> nums[i]; } quicksort(nums, 0, n - 1); for (int i = 0; i < n; i++) {
cout << nums[i] << " "; } return 0;}

03 归并排序

#include 
using namespace std;#include
void Merge(vector
&Array, int front, int mid, int end) {
vector
LeftSubArray(Array.begin() + front, Array.begin() + mid + 1); vector
RightSubArray(Array.begin() + mid + 1, Array.begin() + end + 1); int idxLeft = 0, idxRight = 0; LeftSubArray.insert(LeftSubArray.end(), numeric_limits
::max()); RightSubArray.insert(RightSubArray.end(), numeric_limits
::max()); for (int i = front; i <= end; i++) { if (LeftSubArray[idxLeft] < RightSubArray[idxRight]) { Array[i] = LeftSubArray[idxLeft]; idxLeft++; } else { Array[i] = RightSubArray[idxRight]; idxRight++; } }}void MergeSort(vector
&Array, int front, int end) { if (front >= end) return; int mid = (front + end) / 2; MergeSort(Array, front, mid); MergeSort(Array, mid + 1, end); Merge(Array, front, mid, end);}int main(){ int n; cin >> n; vector
nums(n); for(int i=0;i
> nums[i]; } MergeSort(nums,0,n-1); for(int i=0;i

转载地址:http://zkztn.baihongyu.com/

你可能感兴趣的文章
架构的演进
查看>>
Elastic-Job的基础使用
查看>>
策略过滤器的灵活性分析
查看>>
POI的使用
查看>>
Anaconda和PyCharm的下载、安装和配置
查看>>
Mockito单元测试简述
查看>>
GUAVA的常用方法汇总
查看>>
装饰器和门面设计模式介绍
查看>>
创建型模式——克隆模式
查看>>
JVM关闭和Hook钩子
查看>>
线程中断处理
查看>>
消息队列积压问题处理
查看>>
并行流使用注意事项
查看>>
泛型擦除机制及相关问题
查看>>
Jackson日期反序列化时区问题
查看>>
《设计模式》
查看>>
单例设计模式
查看>>
面试题集锦(一)
查看>>
Calendar类方法——编写万年历的两种方式
查看>>
File类的使用——遍历所有文件及子文件以及遍历删除
查看>>