排序算法(NC140/考察次数Top2/难度中等)

描述:
给定一个数组,请你编写一个函数,返回该数组排序后的形式。

示例1
输入:
[5,3,1,2,4]
返回值:
[1,2,3,4,5]
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型vector 待排序的数组
     * @return int整型vector
     */
    vector<int> MySort(vector<int>& arr) {
           //思路,本题计划采用四种思路进行讲解,冒泡法,选择法,库函数法,快速排序法
           //思路1,冒泡法与沉底法思想类似,
           //这里最后的结果是每次将最大的数放到最后,比较n-1次,每次比较的数字都会少一个;
//         int n = arr.size();
//         if(n <= 1)
//             return arr;
//         for(int j = 0; j<n-1; ++j)                       //控制循环的次数
//         {
//             for(int i = 0; i<n-1-j;++i)                  //每次循环比较的次数
//             {
//                 if(arr[i]>arr[i+1])                      //对数组元素进行比较
//                 {
//                     int tmp = arr[i];                    //引入第三者完成两个数的交换
//                     arr[i] = arr[i+1];
//                     arr[i+1] = tmp;
//                 }
//             }
//         }
//         return arr;
 
//         //思路2,选择法,最后的结果是,每次将最小的元素依次排在0到n-1位上
//         int n = arr.size();
//         if(n <= 1)
//             return arr;
//         for(int i = 0; i<n-1;++i)                //依次将0到n-1赋值为最小值
//         {
//             for(int j =i+1; j<=n-1; ++j)         //将选定值后面所有的元素与选定位元素进行比较
//             {
//                 if(arr[j]<arr[i])
//                 {
//                     int tmp = arr[i];            //引入第三者完成两个数的交换
//                     arr[i] = arr[j];
//                     arr[j] = tmp;
//                 }
//             }
//         }
//         return arr;
 
           //思路3,库函数法;直接使用函数进行求解
//         sort(arr.begin(), arr.end());    //sort函数,直接将数组的begin到end进行排序
//         return arr;
 
           //思路4,快排法;
           quickSort(arr, 0, arr.size()-1); //直接调用快排的算法,传入数组指针、排序的起始和终止位置
           return arr;
    }
     
    //快排法的递归函数,定义时参数为数组指针、排序的起始和终止位置
    void quickSort(vector<int>& arr, int left, int right){  
        if(left >= right)                             //递归结束条件
            return;     
        int l=left;
        int r=right;
        int tmp=arr[l];
        while(l < r){                        //递归一直到两者在中间位置相遇结束
            while(l < r && arr[r] >= tmp){   //右边值比基准值大,右边光标左移动
                r--;
            }
            arr[l] = arr[r];                  //当上述条件不满足时,此时的值填左坑
            while(l < r && arr[l] <= tmp){    //左边值比基准值小,左边光标右移动
                l++;
            }
            arr[r] = arr[l];                  //当上述条件不满足时,此时值填右坑
        }
        arr[l] = tmp;                         //把挖坑拿出来的值填到中间位置,返回中间位置
        int mid=l;                            //记录下中间位置的值
        quickSort(arr, left, mid-1);          //中间值以左部分使用快排递归
        quickSort(arr, mid+1, right);         //中间值以右使用快排,注意有时候结合题目可以只排一半
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值