文章目录
- 讲下思想
- 时间复杂度
- 优化
- 代码实现
讲下思想
我这边主要是分左右两边的指针寻找
-
left指针从左边寻找大于p的数
-
right 从右寻找小于p的数
-
然后找到进行交换,直到相遇在一起
-
说明这个位置是分隔的位置
-
而p的数就是分隔的数,所以对p和l进行一个swap
时间复杂度
最坏的情况为O(n^2)
平均为O(nlog2n)
优化
主要从对比元素的选择入手
- 最后交换, 这边必须从右往左开始,不然出问题
- 因为从右就会寻找到比左边小的临界值,从左会寻找到大于的临界值,到时候交换会出问题,这个根据选择的对比标准来的
代码实现
#include <vector>
#include "quicksort.h"
#include <iostream>
#include <QDebug>
using namespace std;
int get_middle(vector<int>& arr, int start, int end) {
if(end == start) return end;
int middle = (end - start)/2;
if(arr[start] > arr[middle]){
swap(arr[start], arr[middle]);
}
if(arr[middle] > arr[end]) {
swap(arr[middle], arr[end]);
}
return middle;
}
void quickSort(vector<int>& arr, int l, int r) {
//[11, 2, 33, 2, 3, 4]
//中值选择
if(l >= r) return;
int i, j;
i = l;
j = r;
int povit = l;
while(i < j) {
while(arr[j] >= arr[povit] && i < j) {
j--;
}
while(arr[i] <= arr[povit] && i < j) {
i++;
}
swap(arr[j], arr[i]);
}
swap(arr[i], arr[povit]);
qDebug() << "排完结果" << arr;
quickSort(arr, l, i - 1);
quickSort(arr, i + 1, r);
}
#include "widget.h"
#include <QApplication>
#include <QDebug>
#include <memory>
#include <vector>
#include "quicksort.h"
#include <iostream>
//extern void quick_sort(int* arr, int low1, int high1);
using namespace std;
class Solution {
public:
bool checkXMatrix(vector<vector<int>>& grid) {
int n = grid.size();
//判断对角线
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(i==j|| j== n-i-1){
if(grid[i][j] == 0) {qDebug()<<i<<j; return false;};
} else {
if(grid[i][j] != 0) {qDebug()<<i<<j; return false;};
}
}
}
return true;
}
};
int main(int argc, char *argv[])
{
vector<int> v3 = {1,49,38,4,97,32,13,27,42 };
int length = v3.size();
qDebug() << v3;
quickSort(v3, 0, length - 1);
qDebug() <<"res" << v3;
return 0;
// Solution so;
// bool su = so.checkXMatrix(v1);
// vector<int> v3 = {1,49,38,4,97,32,13,27,49 };
// quickSort(v3);
}
//快速排序