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;
}
};
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种排序方法代码合集的更多相关文章

  1. WooCommerce代码合集整理

    本文整理了一些WooCommerce代码合集,方便查阅和使用,更是为了理清思路,提高自己.以下WooCommerce简称WC,代码放在主题的functions.php中即可. 修改首页和分类页面每页产 ...

  2. java数组中的三种排序方法中的冒泡排序方法

    我记得我大学学java的时候,怎么就是搞不明白这三种排序方法,也一直不会,现在我有发过来学习下这三种方法并记录下来. 首先说说冒泡排序方法:冒泡排序方法就是把数组中的每一个元素进行比较,如果第i个元素 ...

  3. 计算机视觉与模式识别代码合集第二版two

    Topic Name Reference code Image Segmentation Segmentation by Minimum Code Length AY Yang, J. Wright, ...

  4. 计算机视觉与模式识别代码合集第二版three

    计算机视觉与模式识别代码合集第二版three     Topic Name Reference code Optical Flow Horn and Schunck's Optical Flow   ...

  5. python字符串操作实方法大合集

    python字符串操作实方法大合集,包括了几乎所有常用的python字符串操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等,需要的朋友可以参考下:   #1.去空格及特殊符号 s.st ...

  6. [ZZ] UIUC同学Jia-Bin Huang收集的计算机视觉代码合集

    UIUC同学Jia-Bin Huang收集的计算机视觉代码合集 http://blog.sina.com.cn/s/blog_4a1853330100zwgm.htmlv UIUC的Jia-Bin H ...

  7. AJPFX关于Java中运用数组的四种排序方法

    JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法.快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现.冒泡法是运用遍历数组进行比 ...

  8. 【转载】GitHub 标星 1.2w+,超全 Python 常用代码合集,值得收藏!

    本文转自逆袭的二胖,作者二胖 今天给大家介绍一个由一个国外小哥用好几年时间维护的 Python 代码合集.简单来说就是,这个程序员小哥在几年前开始保存自己写过的 Python 代码,同时把一些自己比较 ...

  9. git常用代码合集

    git常用代码合集 1. Git init:初始化一个仓库 2. Git add 文件名称:添加文件到Git暂存区 3. Git commit -m “message”:将Git暂存区的代码提交到Gi ...

随机推荐

  1. MySQL索引介绍和实战

    索引是什么 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 可以得到索引的本质:索引是数据结构,索引的目的是提高查询效率,可以类比英语新华字典,根据目录定位词 ...

  2. JVM笔记-GC常用参数设置

    GC常用参数 -Xmn -Xms -Xmx -Xss 年轻代 最小堆 最大堆 栈空间, -Xms -Xmx 一般设置成一样大小, -XX:+UseTLAB 使用TLAB,默认打开 -XX:+Print ...

  3. PHP array_key_exists() 函数

    实例 检查键名 "Volvo" 是否存在于数组中: <?php $a=array("Volvo"=>"XC90","B ...

  4. PHP date_diff() 函数

    ------------恢复内容开始------------ 实例 计算两个日期间的差值: <?php$date1=date_create("2013-03-15");$da ...

  5. PHP is_object() 函数

    is_object() 函数用于检测变量是否是一个对象. PHP 版本要求: PHP 4, PHP 5, PHP 7高佣联盟 www.cgewang.com 语法 bool is_object ( m ...

  6. 如果你大学上过编程课,一定被老师提醒过:不要使用 goto 语句!

    如果你上过编程课,一定被老师提醒过:不要使用goto语句! 因为goto语句不仅让代码的可读性很差,随意的跳出还会给程序带来安全隐患. 但是这种几乎被现代编程明令禁止的语句,在计算机诞生之初却司空见惯 ...

  7. Android中的LruCache的原理和使用

    Android中的LruCache的原理和使用 LruCache,虽然很多文章都把LRU翻译成"最近最少使用"缓存策略,但Android中的LruCache真的如此吗? 答案是No ...

  8. DataGrip,一款数据库客户端工具,IDEA的兄弟是真香!

    DataGrip 是一款数据库管理客户端工具,方便的连接到数据库服务器,执行sql语句.创建表.创建索引以及导出数据等. DataGrip 支持几乎所有主流的关系数据库产品,如 DB2.Derby.H ...

  9. 深入学习JDK源码系列之、ArrayList

    前言 JDK源码解析系列文章,都是基于JDK8分析的,虽然JDK15马上要出来了,但是JDK8我还不会,我... 类图 实现了RandomAccess接口,可以随机访问 实现了Cloneable接口, ...

  10. SkyWalking 搭建及简单使用(Linux)

    1.需求 公司项目采用微服务的架构,服务很多,人工监控是不可能的,项目的访问量很大,想通过日志查找某个方法中性能的问题也是非常困难的.但是系统的性能问题是不能忽视的.系统性能检测的问题如鲠在喉,经过长 ...