当前位置: 首页 > article >正文

排序算法-归并排序与快速排序

归并排序与快速排序

快速排序是利用的递归思想:选取一个基准数,把小于基准数的放左边 大于的放右边直到整个序列有序 。快排分割函数 O(lognn), 空间 :没有额外开辟新的数组但是递归树调用函数会占用栈内存 O(logn) 。
归并排序:在递归返回的过程中保证每个返回的子集都是有序的。时间O(logn
n),空间:O(n)。

归并排序

#include<iostream>
#include<stdlib.h>
#include<time.h> 
using namespace std;
//在归 的过程中 进行数据的合并 达到排序的效果
//时间O(logn*n) 空间:O(n) 
//递归排序
void _merge(int arr[], int left, int mid, int right){int *p = new int[right - left + 1]; int idx = 0; int i = left;int j = mid + 1;//开始数据合并 while(i <= mid && j <= right){if(arr[i] <= arr[j]){p[idx++] = arr[i++];}else{p[idx++] = arr[j++];}}//左端有剩余 while(i <= mid){p[idx++] = arr[i++];} //右端有剩余while(j <= right){p[idx++] = arr[j++];} //将合并后的数据拷贝给原数组for(i = left, j = 0; i <= right ; ++i, ++j){arr[i] = p[j];}delete []p; 
} //归并排序递归接口函数 
void  _mergeSort(int arr[], int left, int right){// 递归结束条件if(left >= right) return; int mid = (left + right) / 2;//先传递 _mergeSort(arr, left, mid);_mergeSort(arr, mid + 1, right);//再归并 额外的内存空间 小段有序 和并为 大段有序_merge(arr, left, mid, right); 
} void _mergeSort(int arr[] , int length){return _mergeSort(arr, 0, length - 1);
}int main(){int arr[10];int length = 10;srand(time(NULL));for(int i = 0 ; i < length ; ++i){arr[i] = rand() % 100 + 1;cout<<arr[i]<<" "; }cout<<endl;_mergeSort(arr,length); for(int i = 0 ; i < length ; ++i){cout<<arr[i]<<" "; }return 0;
} 

快速排序

#include<iostream>
#include<stdlib.h>
#include<time.h> 
using namespace std;
//快速排序思想:选取一个基准数,把小于基准数的放左边 大于的放右边 直到整个序列有序 
//从数组左右两边都找 找到一个停下来换另外一边  
//快排优化思想:随着快排算法的执行,数据越来越有序,在一定范围内,可以采用插入排序代替快速排序 //快排分割函数 O(logn*n) 空间 :没有额外开辟新的数组但是递归树调用函数会占用栈内存 O(logn) 
int partation(int arr[] , int begin , int end){int val = arr[begin];int i = begin;int j = end;while(i < j){while(i < j && arr[j] > val)j--;//找到小于基准数 if(i < j){arr[i] = arr[j];i++; }while(i < j && arr[i] < val){i++;}//大于的基准数 if(i < j){arr[j] = arr[i];j--;}} arr[i] = val;return i;
}
//快排的递归接口 
void _fast(int arr[] , int begin , int end){if(begin >= end) return; //递归结束条件//在区间做一次快排int pos = partation(arr, begin, end);//对基准数的左边快排_fast(arr, begin , pos - 1); //对基准数的右边做快排 _fast(arr, pos + 1 , end);}void _fast(int arr[] , int length){return _fast(arr, 0 , length - 1); 
}int main(){int arr[10];int length = 10;srand(time(NULL));for(int i = 0 ; i < length ; ++i){arr[i] = rand() % 100 + 1;cout<<arr[i]<<" "; }cout<<endl;_fast(arr,length); for(int i = 0 ; i < length ; ++i){cout<<arr[i]<<" "; }return 0;
} 
http://www.lryc.cn/news/2396571.html

相关文章:

  • HTML实现端午节主题网站:龙舟争渡,凭吊祭江诵君赋。
  • uniapp uni-id 如果是正式项目,需自行实现发送邮件的相关功能
  • Spring boot 策略模式
  • websocket在vue中的使用步骤,以及实现聊天
  • C++学习-入门到精通【12】文件处理
  • 第十一篇:MySQL 在分布式系统中的一致性保障与中间件实践
  • Java中如何枚举正则表达式捕获组的名字
  • matlab实现图像压缩编码
  • 如何排查Redis单个Key命中率骤降?
  • 记一次 Starrocks be 内存异常宕机
  • Spring Boot 读取.env文件获取配置
  • LangChain-结合GLM+SQL+函数调用实现数据库查询(一)
  • python训练营打卡第41天
  • 1.3HarmonyOS NEXT统一开发范式与跨端适配:开启高效跨设备应用开发新时代
  • 麒麟v10,arm64架构,编译安装Qt5.12.8
  • ArcGIS Pro 3.4 二次开发 - 布局
  • 基于随机函数链接神经网络(RVFL)的锂电池健康状态(SOH)预测
  • 爱其实很简单
  • 2025年渗透测试面试题总结-匿名[校招]安全工程师(甲方)(题目+回答)
  • PySide6 GUI 学习笔记——常用类及控件使用方法(地址类QUrl)
  • 任务23:创建天气信息大屏Django项目
  • 数学分析——一致性(均匀性)和收敛
  • Flutter GridView网格组件
  • 【深度学习】18. 生成模型:Variational Auto-Encoder(VAE)详解
  • NodeJS全栈开发面试题讲解——P6安全与鉴权
  • C# 密封类和密封方法
  • 为什么badmin reconfig以后始终不能提交任务
  • 解决Window10上IP映射重启失效的问题
  • 力扣刷题(第四十四天)
  • MyBatis-Plus高级用法:最优化持久层开发