快速排序
快排思路:
每次排序我们先选定我们要确定位置的值(一般定为数组开头数),然后从头尾两个方向遍历数组,尾部数应该比这个数大,大的话则递减j;头部的数应该比这个数小,小的话递加i;
这次遍历j停在比这个数小的数上面,i停在比这个数大的数上面,那么最后我们交换这两个数。循环进行遍历,直到i>=j停止。最后停的位置就是我们目标数的正确位置,最后再交换这个数和对应位置,完成此次排序。
代码如下:
vector<int> MySort(vector<int>& arr) {
quickSort(arr, 0, arr.size() - 1);
return arr;// write code here
}
void quickSort(vector<int>& arr, int start, int end) {
if (start >= end) return;
int target = arr[start];
int i = start, j = end;
while (i < j) {
while (j > i && arr[j] > target) --j;
while (j > i && arr[i] <= target) ++i;//这里因为i开始停在我们目标值位置
swap(arr[i], arr[j]);
}
swap(arr[i], arr[start]);
cout << target
print(arr);
quickSort(arr, start, i - 1);
quickSort(arr, i + 1, end);
}
};
#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型vector 待排序的数组
* @return int整型vector
*/
void print(vector<int> arr) {
for (const int a : arr) {
cout << a;
}
}
vector<int> MySort(vector<int>& arr) {
quickSort(arr, 0, arr.size() - 1);
return arr;// write code here
}
void quickSort(vector<int>& arr, int start, int end) {
if (start >= end) return;
int target = arr[start];
int i = start, j = end;
while (i < j) {
while (j > i && arr[j] > target) --j;
while (j > i && arr[i] <= target) ++i;//这里因为i开始停在我们目标值位置
swap(arr[i], arr[j]);
}
swap(arr[i], arr[start]);
cout << target
print(arr);
quickSort(arr, start, i - 1);
quickSort(arr, i + 1, end);
}
};
int main() {
vector<int> inputv = { 884688278, 387052570, 77481420, 537616843, 659978110, 215386675, 604354651, 64838842, 830623614, 544526209, 292446044, 570872277, 946770900, 411203381, 445747969, 480363996, 31693639, 303753633, 261627544, 884642435, 978672815, 427529125, 111935818, 109686701, 714012242, 691252458, 230964510, 340316511, 917959651, 544069623, 193715454, 631219735, 219297819, 151485185, 986263711, 805374069, 915272981, 493886311, 970466103, 819959858, 733048764, 393354006, 631784130, 70309112, 513023688, 17092337, 698504118, 937296273, 54807658, 353487181, 82447697, 177571868, 830140516, 536343860, 453463919, 998857732, 280992325, 13701823, 728999048, 764532283, 693597252, 433183457, 157540946, 427514727, 768122842, 782703840, 965184299, 586696306, 256184773, 984427390, 695760794, 738644784, 784607555, 433518449, 440403918, 281397572, 546931356, 995773975, 738026287, 861262547, 119093579, 521612397, 306242389, 84356804, 42607214, 462370265, 294497342, 241316335, 158982405, 970050582, 740856884, 784337461, 885254231, 633020080, 641532230, 421701576, 298738196, 918973856, 472147510, 169670404 };
Solution* s = new Solution();
for (const int i : inputv) { cout << i << ' '; }
cout << endl;
s->MySort(inputv);
for (const int i : inputv) { cout << i<<' '; }
}
第二种实现:
相当于把交换改成填坑,i初始在目标处,j停的位置的值填坑i,然后i再++,i停的位置的值填坑j。最后循环结束,把目标值填到最后i停的位置。(每次填完坑指针递进)
void quick_sort(vector<int> s, int begin, int end)
{
if (begin < end)
{
int i = begin, j = end, target = s[begin];
while (i < j)
{
while(i < j && s[j] >= target) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < target) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = target;
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}