首页 > 编程语言 > 详细

C++ 7种排序方法代码合集

时间:2020-06-18 23:17:36      阅读:62      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

class Solution {
public:

/********************************************************************
直接插入排序
数组前面维持一个有序区,每次从后面的无序区里选一个数插入到前面的有序区,直至全部已排序
*********************************************************************/
void insertsort(vector<int>& nums)
{
    for (int i = 1; i < nums.size(); i++)
    {
        //找到插入位置
        int insertpos = 0, insertval = nums[i];
        while (nums[insertpos] <= nums[i] && insertpos<i)insertpos++;
        //挪动位置来插入
        for (int j = i; j > insertpos; j--)
            nums[j] = nums[j - 1];
        nums[insertpos] = insertval;//插入
    }
}
/*********************************************************************
//希尔排序,直插排序的变形,执行以下循环:
//if(gap<=0)break, else gap=nums.size()/2
//按下标相隔gap进行分组, 对每一组进行直插排序。
*********************************************************************/
void shellsort(vector<int>& nums)
{
    int gap=nums.size()/2;
    while(gap>=1)
    {
        //对于第0,1,..gap-1组进行直插排序 
        for(int i=0;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-1];
                nums[insertpos]=insertval;
            }
        }
        gap/=2;
    }
}
/*********************************************************************
//直接选择排序,后端维护一个有序序列,每次从未排序序列中找出一个最大值,
//与无序序列的最后一个元素交换位置
*********************************************************************/
void choosesort(vector<int>& nums)
{
    for(int i=0;i<nums.size();i++)
    {
        int maxpos=0,maxval=nums[0];//找出[0,nums.size()-i-1]中的最大值
        for(int j=0;j<nums.size()-i;j++)
            if(nums[j]>maxval)maxpos=j,maxval=nums[j];
        int temp=nums[nums.size()-1-i];
        nums[nums.size()-i-1]=maxval;nums[maxpos]=temp;
    }
}
/*********************************************************************
//堆排序,选择排序的变种,利用一个大顶堆(升序排序),保证根节点为最大元素,
//这样一直与末尾交换并删除,最终完成排序
//重点是大顶堆的维护 buildheap()
*********************************************************************/
//对于前n个元素,使其构成一个大顶堆
void buildheap(vector<int>& nums,int n)
{
    //从叶子往前找,若是叶子小于根,进行互换,序号为i的叶子其根序号为(i-1)/2
    for(int i=n-1;i>0;i--)
    {
        if(nums[i]>nums[(i-1)/2])
        {
            int temp=nums[i];
            nums[i]=nums[(i-1)/2];nums[(i-1)/2]=temp;
        }
    }
}

void heapsort(vector<int>& nums)
{
    for(int i=0;i<nums.size();i++)
    {
        buildheap(nums,nums.size()-i);//维护大顶堆
        int temp=nums[0];//交换首尾元素
        nums[0]=nums[nums.size()-i-1];nums[nums.size()-i-1]=temp;
    }
}

/*********************************************************************
冒泡排序
两两交换...
*********************************************************************/
void bubblesort(vector<int>& nums)
{
    for(int i=0;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+1,right);
}

/*********************************************************************
归并排序,
将已有序的子序列合并,得到完全有序的序列;
即先使每个子序列有序,再使子序列段间有序。
*********************************************************************/
void merge(vector<int>& nums, int left, int mid, int right)
{
    //对两个有序序列作归并处理
    int l = left, r = mid + 1;
    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 = 0; 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) / 2;
    //对分组的两个序列进行归并排序
    mergesort(nums, left, mid);
    mergesort(nums, mid + 1, right);
    //重点是归并步骤,把两个有序子序列合并成一个有序序列
    merge(nums, left, mid, right);
}

    vector<int> sortArray(vector<int>& nums) {
        
        quicksort(nums,0,nums.size()-1);

        return nums;
    }
};

 

class Solution {
public:

/********************************************************************
直接插入排序
数组前面维持一个有序区,每次从后面的无序区里选一个数插入到前面的有序区,直至全部已排序
*********************************************************************/
void insertsort(vector<int>& nums)
{
    for (int i = 1; i < nums.size(); i++)
    {
        //找到插入位置
        int insertpos = 0, insertval = nums[i];
        while (nums[insertpos] <= nums[i] && insertpos<i)insertpos++;
        //挪动位置来插入
        for (int j = i; j > insertpos; j--)
            nums[j] = nums[j - 1];
        nums[insertpos] = insertval;//插入
    }
}
/*********************************************************************
//希尔排序,直插排序的变形,执行以下循环:
//if(gap<=0)break, else gap=nums.size()/2
//按下标相隔gap进行分组, 对每一组进行直插排序。
*********************************************************************/
void shellsort(vector<int>& nums)
{
    int gap=nums.size()/2;
    while(gap>=1)
    {
        //对于第0,1,..gap-1组进行直插排序 
        for(int i=0;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-1];
                nums[insertpos]=insertval;
            }
        }
        gap/=2;
    }
}
/*********************************************************************
//直接选择排序,后端维护一个有序序列,每次从未排序序列中找出一个最大值,
//与无序序列的最后一个元素交换位置
*********************************************************************/
void choosesort(vector<int>& nums)
{
    for(int i=0;i<nums.size();i++)
    {
        int maxpos=0,maxval=nums[0];//找出[0,nums.size()-i-1]中的最大值
        for(int j=0;j<nums.size()-i;j++)
            if(nums[j]>maxval)maxpos=j,maxval=nums[j];
        int temp=nums[nums.size()-1-i];
        nums[nums.size()-i-1]=maxval;nums[maxpos]=temp;
    }
}
/*********************************************************************
//堆排序,选择排序的变种,利用一个大顶堆(升序排序),保证根节点为最大元素,
//这样一直与末尾交换并删除,最终完成排序
//重点是大顶堆的维护 buildheap()
*********************************************************************/
//对于前n个元素,使其构成一个大顶堆
void buildheap(vector<int>& nums,int n)
{
    //从叶子往前找,若是叶子小于根,进行互换,序号为i的叶子其根序号为(i-1)/2
    for(int i=n-1;i>0;i--)
    {
        if(nums[i]>nums[(i-1)/2])
        {
            int temp=nums[i];
            nums[i]=nums[(i-1)/2];nums[(i-1)/2]=temp;
        }
    }
}

void heapsort(vector<int>& nums)
{
    for(int i=0;i<nums.size();i++)
    {
        buildheap(nums,nums.size()-i);//维护大顶堆
        int temp=nums[0];//交换首尾元素
        nums[0]=nums[nums.size()-i-1];nums[nums.size()-i-1]=temp;
    }
}

/*********************************************************************
冒泡排序
两两交换...
*********************************************************************/
void bubblesort(vector<int>& nums)
{
    for(int i=0;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+1,right);
}

/*********************************************************************
归并排序,
将已有序的子序列合并,得到完全有序的序列;
即先使每个子序列有序,再使子序列段间有序。
*********************************************************************/
void merge(vector<int>& nums, int left, int mid, int right)
{
    //对两个有序序列作归并处理
    int l = left, r = mid + 1;
    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 = 0; 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) / 2;
    //对分组的两个序列进行归并排序
    mergesort(nums, left, mid);
    mergesort(nums, mid + 1, right);
    //重点是归并步骤,把两个有序子序列合并成一个有序序列
    merge(nums, left, mid, right);
}

    vector<int> sortArray(vector<int>& nums) {
        
        quicksort(nums,0,nums.size()-1);

        return nums;
    }
};

C++ 7种排序方法代码合集

原文:https://www.cnblogs.com/woodineast/p/13160348.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!