LeetCode 912. 排序数组

给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]

输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]

输出:[0,0,1,1,2,5]

提示:

1 <= nums.length <= 50000

-50000 <= nums[i] <= 50000

class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
//bubbleSort(nums); //selectionSort(nums); //InsertionSort(nums); //ShellSort(nums); //return mergeSort(nums); //quickSort(nums,0,nums.size()-1); heapSort(nums); return nums;
} // 冒泡排序 O(n²)
void bubbleSort(vector<int>& nums){
for(int i=nums.size()-1;i>0;i--)
for(int j=0;j<i;j++){
if(nums[j]>nums[j+1])
swap(nums[j],nums[j+1]);
}
} // 选择排序 O(n²)
void selectionSort(vector<int>& nums){
for(int i=nums.size()-1;i>0;i--){
int maxSub=0;
for(int j=1;j<=i;j++){
if(nums[j]>nums[maxSub])
maxSub=j;
}
swap(nums[i],nums[maxSub]);
} } // 插入排序 O(n²)
void InsertionSort(vector<int>& nums){
for(int i=1;i<nums.size();i++){
int pos=i;
int curVal = nums[i];
while(pos>0 && nums[pos-1]>curVal){
nums[pos]=nums[pos-1];
pos--;
}
nums[pos]=curVal;
}
} //希尔排序 O(nlogn)
void ShellSort(vector<int>& nums){
for(int gap = nums.size()/2; gap>0; gap/=2)
for(int i=gap; i<nums.size();i++){
int curVal = nums[i];
int pos=i;
while(pos>=gap && nums[pos-gap]>curVal){
nums[pos]=nums[pos-gap];
pos-=gap;
}
nums[pos]=curVal;
}
} // 归并排序 O(nlogn) 空间上的开销
vector<int> mergeSort(vector<int> nums){
if(nums.size()<2)
return nums; int l=0,r=nums.size()-1;
int mid=(l+r)/2;
vector<int> left = mergeSort(vector<int>(nums.begin(),nums.begin()+mid+1)); //类似数组切片 ,注意mid+1
vector<int> right= mergeSort(vector<int>(nums.begin()+mid+1,nums.end())); int i=0,j=0;
vector<int> res;
while(i<left.size() && j<right.size()){
if(left[i]<right[j]){
res.push_back(left[i]);
i++;
}
else{
res.push_back(right[j]);
j++;
}
} if(i<left.size())
res.insert(res.end(),left.begin()+i,left.end());
else if(j<right.size())
res.insert(res.end(),right.begin()+j,right.end());
return res;
} //归并排序 写法2 temp数组有效利用空间
void mergeSort(vector<int>& nums, vector<int>& temp, int l, int r){
if(r-l<1) return; int mid=(l+r)/2;
mergeSort(nums,temp,l,mid);
mergeSort(nums,temp,mid+1,r); int i=l,k=l,j=mid+1;
while(i<=mid && j<=r)
if(nums[i]<=nums[j]) temp[k++]=nums[i++];
else temp[k++]=nums[j++]; while(i<=mid) temp[k++]=nums[i++];
while(j<=r) temp[k++]=nums[j++];
while(--j>=l) nums[j]=temp[j];
} // 快速排序 O(nlogn)
void quickSort(vector<int>& nums, int l,int r){
if(l>=r)
return; swap(nums[l], nums[rand() % (r - l + 1) + l]); // 不随机会超时
int pivot=nums[l];
int i=l+1, j=r; //注意此处从 l+1 开始算
while(i<=j){ //注意比较符号 <=
while(i<=j && nums[i]<=pivot) i++;
while(i<=j && nums[j]>=pivot)j--;
if(j<i) break;
swap(nums[i],nums[j]);
}
swap(nums[j],nums[l]);
quickSort(nums,l,j-1);
quickSort(nums,j+1,r); } //快速排序 写法2
void quickSort2(vector<int>& nums,int l, int r){
if(l>=r) return; //swap(nums[l],nums[random()%(r-l+1)+l]);
int pivot=nums[l];
int i=l,j=r;
while(i<j){
while(i<j && nums[j]>=pivot)j--;
while(i<j && nums[i]<=pivot)i++;
swap(nums[i],nums[j]);
}
swap(nums[l],nums[i]);
quickSort2(nums,l,i-1);
quickSort2(nums,i+1,r);
}
// 堆排序 O(nlogn)
void heapSort(vector<int>& nums){
int len=nums.size();
for(int i=len/2-1; i>=0;i-- ) //构建大根堆
MaxHeapify(nums, len, i); for(int i=len-1;i>0;i--){
swap(nums[0],nums[i]); // 根(最大值)放在末尾排序部分
MaxHeapify(nums,i, 0); // 调整未排序部分
}
} //堆调整
void MaxHeapify(vector<int>& nums,int len,int index){
int lc=2*index+1;
int rc=2*index+2;
int largest=index; if(lc<len && nums[lc]>nums[largest])
largest=lc;
if(rc<len && nums[rc]>nums[largest])
largest=rc; if(largest!=index){
swap(nums[index],nums[largest]); //交换父子节点的值
MaxHeapify(nums, len, largest); //调整子树
}
} };

【数据结构 C++】排序——冒泡、插入、选择、希尔、归并、快排、堆排序的更多相关文章

  1. c++ 排序 冒泡 插入 选择 快速

    //冒泡 #include <iostream> using namespace std; void bubbleSort(int* list,int index) { ;i--) //i ...

  2. 《java数据结构与算法》系列之“简单排序"-冒泡,选择,插入

    好几天又没写,因为这几天很闲,平时忙的时候自己再累都不会睡着,但是呢这没事了,照理说应该是不瞌睡了,结果还睡着了. 所以说,人很贱.也验证了一句话,没有目标的人其实最无聊.人一定要有自己的工作,这工作 ...

  3. Java数据结构和算法(三)--三大排序--冒泡、选择、插入排序

    三大排序在我们刚开始学习编程的时候就接触过,也是刚开始工作笔试会遇到的,后续也会学习希尔.快速排序,这里顺便复习一下 冒泡排序: 步骤: 1.从首位开始,比较首位和右边的索引 2.如果当前位置比右边的 ...

  4. java面试准备之基础排序——冒泡与选择排序

    选择排序:     [java]    public void select(int[] arr){            for(int i=0;i<arr.length;i++){      ...

  5. (三)Java数据结构和算法——冒泡、选择、插入排序算法

    一.冒泡排序 冒泡算法的运作规律如下: ①.比较相邻的元素.如果第一个比第二个大,就交换他们两个. ②.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数( ...

  6. 数据结构65:快速排序算法(QSort,快排)

    上节介绍了如何使用起泡排序的思想对无序表中的记录按照一定的规则进行排序,本节再介绍一种排序算法——快速排序算法(Quick Sort). C语言中自带函数库中就有快速排序——qsort函数 ,包含在 ...

  7. 【PHP数据结构】交换排序:冒泡、快排

    上篇文章中我们好好地学习了一下插入类相关的两个排序,不过,和交换类的排序对比的话,它们真的只是弟弟.甚至可以说,在所有的排序算法中,最出名的两个排序都在今天要介绍的交换排序中了.不管是冒泡.还是快排, ...

  8. 冒泡,快排算法之javascript初体验

    引子:javascript实际使用的排序算法在标准中没有定义,可能是冒泡或快排.不用数组原生的 sort() 方法来实现冒泡和快排. Part 1:冒泡排序(Bubble Sort) 原理:临近的两数 ...

  9. python 冒泡和快排,不多说【无聊】

    #-*-coding:utf8-*- import random a=[] b=[] def init_array(): for i in range(10000): v = random.randi ...

  10. python 冒泡和快排,不多说

    #-*-coding:utf8-*- import random a=[] b=[] def init_array(): for i in range(10000): v = random.randi ...

随机推荐

  1. uboot常用命令及其使用

    环境变量设置 setenv 设置一个环境变量 # 格式:setenv key vlaue setenv bootdelay 5 # 设置uboot启动延时5s 删除一个环境变量 uboot对于一个没有 ...

  2. C语言中动态内存分配的本质是什么?

    摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...

  3. C# List集合类常用操作:三、查找

    List集合查询数据 List<Employees> employees = new List<Employees>(); employees.Add(new Employee ...

  4. Redis单节点安装与使用

    1.配置阿里云yum源 下载配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7 ...

  5. 【转】asp.net core环境变量详解

    asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境 ...

  6. plsql报ora-00911错误的解决

    论不作死就不会死的过程,楼主之前因为得了一个oralce9i的精简版的客户端安装包,我也分享过给其他人使用这个安装包,没听人反馈过说有问题,所以这次换了电脑后果断就安装这个客户端.然后问题就来了. 反 ...

  7. 改Jupyter Notebook的默认工作路径?

    如何更改Jupyter Notebook的默认工作路径? 1.在cmd中输入命令使Jupyter产生配置文件:Jupyter_notebook_config.py jupyter notebook - ...

  8. Java基础系列(22)- For循环详解

    For循环 虽然所有循环结构都可以用while和dowhile表示,但是Java提供了另外一种语句for循环,使一些循环结构变动更加简单 for循环语句是支持迭代的一种通用结构,是最有效.最灵活的循环 ...

  9. php socket 发送http请求 GET POST

    http://docs.php-http.org/en/latest/httplug/users.html <?php /** * Created by PhpStorm. * User: Mc ...

  10. 『GoLang』包

    可见性规则 在Go语言中,标识符必须以一个大写字母开头,这样才可以被外部包的代码所使用,这被称为导出.标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的.但是包名不管 ...