常见排序算法整理2(C++实现)
1. 归并排序
- 时间复杂度:O(nlogn)
- 空间复杂度:O(n)
算法的基本思想:将每两个相邻元素进行归并,得到新的归并数组,每两个一组再次进行归并排序,直到所有元素均已排序。
C++实现:
void mergehelp(int* A,int left,int mid,int right)
{
int* B=new int[right-left+1];
int index=0;
int i=left;
int j=mid+1;
while(i<=mid&&j<=right)
{
B[index++]=A[i]<=A[j]?A[i++]:A[j++];
}
while(i<=mid)
{
B[index++]=A[i++];
}
while(j<=right)
{
B[index++]=A[j++];
}
for(int i=0;i<index;i++)
{
A[left++]=B[i];
}
}
void merge(int* A,int left,int right)
{
if(left>=right)
return;
int mid=(left+right)/2;
merge(A,left,mid);
merge(A,mid+1,right);
mergehelp(A,left,mid,right);
}
int* mergeSort(int* A, int n) {
int left=0;
int right=n-1;
merge(A,0,n-1);
return A;
}
2. 快速排序
- 时间复杂度:O(nlogn)
- 空间复杂度:O(logn)
算法的基本思想:
通过partition函数寻找位置点,利用递归地思想,不断对两部分数组进行划分,直到数组的个数为1。partition函数的思想,可以通过填坑法来寻找划分点pivot,将大于等于pivot值的元素放在数组右侧,将小于等于pivot值的元素放在数组左侧,返回划分点pivot的位置。
C++实现:
int partition(int* A,int left,int right)
{
int pivot=A[left];
while(left<right)
{
while(left<right&&A[right]>=pivot)
{
right--;
}
swap(A[left],A[right]);
while(left<right&&A[left]<=pivot)
{
left++;
}
swap(A[left],A[right]);
}
return left;
}
void quickSortHelp(int* A,int left,int right)
{
if(left<right)
{
int pivot=partition(A,left,right);
quickSortHelp(A,left,pivot-1);
quickSortHelp(A,pivot+1,right);
}
}
int* quickSort(int* A, int n) {
int left=0;
int right=n-1;
quickSortHelp(A,left,right);
return A;
}
3. 堆排序
- 时间复杂度:O(nlogn)
- 空间复杂度:O(1)
- 算法的基本思想:构造一个最大堆,堆顶的元素为最大值,将堆顶元素与数组的最后一个元素交换,则最后一个元素已排序好。不断地将堆顶元素与最后一个元素交换,直到数组的个数为一。每次交换后,都需要利用heapify函数对堆进行一次调整。构造最大堆的过程也是利用heapify函数对数组值不断进行调整。
- C++实现:
void heapify(int* A,int left,int right)
{
int cur=left;
int child=2*cur+1;
while(child<right)
{
if(child+1<right&&A[child+1]>A[child])
{
child++;
}
if(A[child]>A[cur])
{
swap(A[cur],A[child]);
cur=child;
child=2*cur+1;
}
else
{
break;
}
}
}
int* heapSort(int* A, int n) {
for(int i=n/2-1;i>=0;i--)
{
heapify(A,i,n-1);
}
for(int i=n-1;i>0;i--)
{
swap(A[i],A[0]);
heapify(A,0,i);
}
return A;
}
4. 希尔排序
- 时间复杂度:O(nlogn)
- 空间复杂度:O(1)
- 算法的基本思想:希尔排序是插入排序的衍生版本。设置一个增量d,将数组元素分到d个增量中,在每一个增量中采用插入排序。之后缩小增量d的值,再次将元素分到d个增量中,进行插入排序。直到增量d为1,完成排序。
C++实现:int* shellSort(int* A, int n) {
int d=n/2;
while(d>=1)
{
for(int i=d;i<n;i++)
{
int get=A[i];
int j=i-d;
while(j>=0&&A[j]>=get)
{
A[j+d]=A[j];
j=j-d;
}
A[j+d]=get;
}
d=d/2;
}
return A;
}
常见排序算法整理2(C++实现)相关推荐
- Java常见排序算法之插入排序
一.概述 本节由小千给大家分享Java常见排序算法之插入排序,之前我们说过排序是算法中的一部分.所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏, ...
- python常见排序算法解析
python--常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分 ...
- 常见排序算法及对应的时间复杂度和空间复杂度
排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 排 ...
- 常见排序算法2–直接插入法vs希尔排序法
常见排序算法–直接插入法vs希尔排序法 首先,我们通过一个例子来了解直接插入算法 例如,对原始数组{15,24,3,49,10}进行直接插入排序(由小到大进行排序) 第一个数15无法比较,第二个数24 ...
- php常见排序算去,PHP兑现常见排序算法
PHP实现常见排序算法 //插入排序(一维数组) function insert_sort($arr){ $count = count($arr); for($i=1; $i $tmp = $arr[ ...
- Java常见排序算法
Java常见排序算法 转载于:https://www.cnblogs.com/hfultrastrong/p/7829889.html
- android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些
学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java.为了加入到Java这一高薪行业,很 ...
- Java 实现常见排序算法
Java 实现常见排序算法 1. 综述 复习常见排序算法,用Java实现. 2. 代码 1 package cn.edu.tju.scs; 2 3 public class Sort { 4 publ ...
- 常见排序算法_解释的算法-它们是什么以及常见的排序算法
常见排序算法 In its most basic form, an algorithm is a set of detailed step-by-step instructions to comple ...
- python实现常见排序算法
python实现常见排序算法 快速排序 思想:取出第一个元素把它放到序列的中间某一个正确位置,以它进行分割成左边和右边,再分别对左边和右边进行取元素分割(递归) 递归实现 def quicksort( ...
最新文章
- 怎样做网络推广浅析网站被K之后,优化人员们要注意的方面是哪些?
- UI 设计:如何做到理性?
- 开源]OSharpNS 步步为营系列 - 1. 业务模块设计
- RabbitMQ播放模块! 构架
- c++函数传参:值传递、指针传递、引用传递
- 一个从源代码里提取中文字符串的java类
- 最新可用的goole翻译接口
- 数据结构期末复习(四)
- 【Tomcat】Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析
- mybatis利用mapper代理的方法实现多条件查询
- Load balancer does not have available server for client:xxx
- springboot 使用mybatis与mybatis-generator与druid (gradle构建)
- Word弹窗提示“拼写或语法错误太多,无法继续显示”的处理办法
- Easyui 官网网址
- mysql mpm_zabbix+mysql mpm监控
- 一句话+一张图——说清楚Aprioir关联规则算法
- 陈艾盐:《春燕》百集访谈节目第五十九集
- 蓝牙耳机连接电脑无法调节音量
- 知心世界姐王瑞平:谷传民与大衣哥朱之文是沟通问题不是人品问题
- SSM_jsp实现汽车销售管理系统
热门文章
- 了解IHttpModule接口事件执行顺便 获取Session
- Home Assistant系列 -- 设置界面语言与地理位置
- AppLinks使用详解
- Demo源码放送:打通B/S与C/S !让HTML5 WebSocket与.NET Socket公用同一个服务端!
- 基于Berkeley DB实现的持久化队列
- python ** 运算符_Python学习第二天--运算符小结
- python中0x3f_Python学习笔记(一):基本数据类型
- java 游戏 异步框架_基于Java的轻量级异步编程框架
- java定时发送_Java 定时发送邮件 | 学步园
- 在HTML中添加图片阴影,html – 如何在CSS中为图像添加内部阴影[复制]