描述:
给定一个数组,请你编写一个函数,返回该数组排序后的形式。
示例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算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!