C++ 7种排序方法代码合集
class Solution {
public: /********************************************************************
直接插入排序
数组前面维持一个有序区,每次从后面的无序区里选一个数插入到前面的有序区,直至全部已排序
*********************************************************************/
void insertsort(vector<int>& nums)
{
for (int i = ; i < nums.size(); i++)
{
//找到插入位置
int insertpos = , insertval = nums[i];
while (nums[insertpos] <= nums[i] && insertpos<i)insertpos++;
//挪动位置来插入
for (int j = i; j > insertpos; j--)
nums[j] = nums[j - ];
nums[insertpos] = insertval;//插入
}
}
/*********************************************************************
//希尔排序,直插排序的变形,执行以下循环:
//if(gap<=0)break, else gap=nums.size()/2
//按下标相隔gap进行分组, 对每一组进行直插排序。
*********************************************************************/
void shellsort(vector<int>& nums)
{
int gap=nums.size()/;
while(gap>=)
{
//对于第0,1,..gap-1组进行直插排序
for(int i=;i<gap;i++)
{
//对 [j,j+gap,j+2gap,...]进行只直插排序
for(int j=i;j<nums.size();j+=gap)
{
int insertpos=i,insertval=nums[j];
while(nums[insertpos]<=nums[j] && insertpos<j)insertpos++;
for(int k=j;k>insertpos;k--)nums[k]=nums[k-];
nums[insertpos]=insertval;
}
}
gap/=;
}
}
/*********************************************************************
//直接选择排序,后端维护一个有序序列,每次从未排序序列中找出一个最大值,
//与无序序列的最后一个元素交换位置
*********************************************************************/
void choosesort(vector<int>& nums)
{
for(int i=;i<nums.size();i++)
{
int maxpos=,maxval=nums[];//找出[0,nums.size()-i-1]中的最大值
for(int j=;j<nums.size()-i;j++)
if(nums[j]>maxval)maxpos=j,maxval=nums[j];
int temp=nums[nums.size()--i];
nums[nums.size()-i-]=maxval;nums[maxpos]=temp;
}
}
/*********************************************************************
//堆排序,选择排序的变种,利用一个大顶堆(升序排序),保证根节点为最大元素,
//这样一直与末尾交换并删除,最终完成排序
//重点是大顶堆的维护 buildheap()
*********************************************************************/
//对于前n个元素,使其构成一个大顶堆
void buildheap(vector<int>& nums,int n)
{
//从叶子往前找,若是叶子小于根,进行互换,序号为i的叶子其根序号为(i-1)/2
for(int i=n-;i>;i--)
{
if(nums[i]>nums[(i-)/])
{
int temp=nums[i];
nums[i]=nums[(i-)/];nums[(i-)/]=temp;
}
}
} void heapsort(vector<int>& nums)
{
for(int i=;i<nums.size();i++)
{
buildheap(nums,nums.size()-i);//维护大顶堆
int temp=nums[];//交换首尾元素
nums[]=nums[nums.size()-i-];nums[nums.size()-i-]=temp;
}
} /*********************************************************************
冒泡排序
两两交换...
*********************************************************************/
void bubblesort(vector<int>& nums)
{
for(int i=;i<nums.size();i++)
for(int j=i;j<nums.size();j++)
{
if(nums[j]<nums[i])
{
int temp=nums[i];
nums[i]=nums[j];nums[j]=temp;
}
}
}
/*********************************************************************
快速排序,选取一个基准,一趟排序后,把大于基准的元素放在右边,
小于它的元素放在左边,一直下去直到排序完成。
*********************************************************************/
void quicksort(vector<int>& nums,int left,int right)
{
if(left>=right)return;
int l=left,r=right;
int base=nums[l];
while(l<r)
{
while(nums[r]>=base && l<r)r--;
nums[l]=nums[r];
while(nums[l]<=base && l<r)l++;
nums[r]=nums[l];
}
nums[l]=base;
quicksort(nums,left,l);
quicksort(nums,l+,right);
} /*********************************************************************
归并排序,
将已有序的子序列合并,得到完全有序的序列;
即先使每个子序列有序,再使子序列段间有序。
*********************************************************************/
void merge(vector<int>& nums, int left, int mid, int right)
{
//对两个有序序列作归并处理
int l = left, r = mid + ;
vector<int> arr;//归并后的序列,等下更新到nums中
while (l <= mid && r <= right)
{
if (nums[l] <= nums[r])
{
arr.push_back(nums[l++]);
}
else
{
arr.push_back(nums[r++]);
}
}
while (l <= mid)arr.push_back(nums[l++]);
while (r <= right)arr.push_back(nums[r++]);
//arr更新到nums中
for (int i = ; i < arr.size(); i++)
nums[left + i] = arr[i];
} void mergesort(vector<int>& nums, int left, int right)
{
if (right <= left)return;
int mid = (right + left) / ;
//对分组的两个序列进行归并排序
mergesort(nums, left, mid);
mergesort(nums, mid + , right);
//重点是归并步骤,把两个有序子序列合并成一个有序序列
merge(nums, left, mid, right);
} vector<int> sortArray(vector<int>& nums) { quicksort(nums,,nums.size()-); return nums;
}
};
C++ 7种排序方法代码合集的更多相关文章
- WooCommerce代码合集整理
本文整理了一些WooCommerce代码合集,方便查阅和使用,更是为了理清思路,提高自己.以下WooCommerce简称WC,代码放在主题的functions.php中即可. 修改首页和分类页面每页产 ...
- java数组中的三种排序方法中的冒泡排序方法
我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...
- 计算机视觉与模式识别代码合集第二版two
Topic Name Reference code Image Segmentation Segmentation by Minimum Code Length AY Yang, J. Wright, ...
- 计算机视觉与模式识别代码合集第二版three
计算机视觉与模式识别代码合集第二版three Topic Name Reference code Optical Flow Horn and Schunck's Optical Flow ...
- python字符串操作实方法大合集
python字符串操作实方法大合集,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等,需要的朋友可以参考下: #1.去空格及特殊符号 s.st ...
- [ZZ] UIUC同学Jia-Bin Huang收集的计算机视觉代码合集
UIUC同学Jia-Bin Huang收集的计算机视觉代码合集 http://blog.sina.com.cn/s/blog_4a1853330100zwgm.htmlv UIUC的Jia-Bin H ...
- AJPFX关于Java中运用数组的四种排序方法
JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法.快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现.冒泡法是运用遍历数组进行比 ...
- 【转载】GitHub 标星 1.2w+,超全 Python 常用代码合集,值得收藏!
本文转自逆袭的二胖,作者二胖 今天给大家介绍一个由一个国外小哥用好几年时间维护的 Python 代码合集.简单来说就是,这个程序员小哥在几年前开始保存自己写过的 Python 代码,同时把一些自己比较 ...
- git常用代码合集
git常用代码合集 1. Git init:初始化一个仓库 2. Git add 文件名称:添加文件到Git暂存区 3. Git commit -m “message”:将Git暂存区的代码提交到Gi ...
随机推荐
- SpringCloud Bus消息总线简介
简介: SpringCloud Bus配合SpringCloud Config使用可以实现配置的动态刷新 SpringCloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了 ...
- python数据处理书pdf版本|内附网盘链接直接提取|
Python数据处理采用基于项目的方法,介绍用Python完成数据获取.数据清洗.数据探索.数据呈现.数据规模化和自动化的过程.主要内容包括:Python基础知识,如何从CSV.Excel.XML.J ...
- MapReduce之Combiner合并
Combiner是MR程序中Mapper和Reducer之外的一种组件(本质是一个Reducer类) Combinr组件的父类就是Reducer Conbimer只有在驱动类里设置了之后,才会运行 C ...
- Redis 的 KEYS 命令不能乱用啊
KESY 命令 时间复杂度: O(N) , 假设Redis中的键名和给定的模式的长度有限的情况下,N为数据库中key的个数. Redis Keys 命令用于查找所有符合给定模式 pattern 的 k ...
- PHP is_infinite() 函数
------------恢复内容开始------------ 实例 判断一个值是否为无限值: <?php echo is_infinite(2) . "<br>" ...
- SpringBoot2 整合 Swagger2文档 使用BootstrapUI页面
SpringBoot2 整合 Swagger2 SpringBoot整合三板斧 第一步.引入pom <dependency> <groupId>com.spring4all&l ...
- 【问题记录】ajax dataType属性
最近整理代码,发现一些ajax dataType 属性值设置的问题.下面直接上代码说明下 前台ajax请求 $.ajax({ type: "get", dataType: &quo ...
- tensorflow2.0 实现gpu和cpu切换
昨天把GPU版本的tf2.0 安装成功之后,现在所有的代码运行居然都在gpu上跑了,并且在对gpu使用情况没有限制的条件下,既然gpu内存跑满了,代码就崩了怎么样才能随心所欲的指定代码是在cpu还 ...
- Elasticsearch权威指南(中文版)
Elasticsearch权威指南(中文版) 下载地址: https://pan.baidu.com/s/1bUGJmwS2Gp0B32xUyXxCIw 扫码下面二维码关注公众号回复100010 获取 ...
- Linux操作系统 可插拔认证模块PAM(3)
六.Linux 操作系统安全登陆设计 自己编写PAM 模块并编译成动态链接库so 文件,将其添加进/etc/pam.d/login 文件中实现命令行安全登陆设计,将其添加进/etc/pam.d/lig ...