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. matplotlib基础汇总_02

    设置plot的风格和样式 点和线的样式 颜色 参数color或c 五种定义颜色值的方式 别名 color='r' 合法的HTML颜色名 color = 'red' HTML十六进制字符串 color ...

  2. Python重命名和删除文件

    Python重命名和删除文件: rename(当前的文件名,新文件名): 将当前的文件名修改为新文件名 程序: # os.rename('旧名字',’新名字‘) import os os.rename ...

  3. LeetCode 算法 | 如何拆分数组?

    题目: 给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大 ...

  4. 【01python基础】

    1.python的环境搭建(Python3 下载) Python 官网:https://www.python.org/ Python文档下载地址:https://www.python.org/doc/ ...

  5. JAVA的基本程序设计结构(下)

    字符串 Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫做 String. String e=""; //an empty String String ...

  6. 微信小程序--家庭记账小账本(三)

    家庭记账小账本打算先通过微信小程序来实现,昨天就去注册了解了一下微信小程序,感觉比较复杂而且困难.如何将ecplise源代码与小程序连接,如何建立数据库等等都困扰了我.查阅网上的资料也没有很大的进展. ...

  7. Nginx配置SSL证书,提高网络安全性

    首先区别Http与Https HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高 ...

  8. Phthon环境搭建

    一,官网去下载 https://www.python.org/downloads/ 二,安装 三,验证python 四.IPython IPython 是一个 python 的交互式 shell,比默 ...

  9. 我搭的神经网络不work该怎么办!看看这11条新手最容易犯的错误

    1. 忘了数据规范化 2. 没有检查结果 3. 忘了数据预处理 4. 忘了正则化 5. 设置了过大的批次大小 6. 使用了不适当的学习率 7. 在最后一层使用了错误的激活函数 8. 网络含有不良梯度 ...

  10. Java—增强for循环与for循环的区别/泛型通配符/LinkedList集合

    增强for循环 增强for循环是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的. 它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作. ...