欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

C++快速排序的几种实现方法+优化

时间:2023-04-29
目录

左右挖坑互填左右交换三数取中优化完整代码 左右挖坑互填

//分割数组int partition(int a[], int l, int r){ int begin = l; int x = a[l]; while(l < r){ while(l < r && a[r] <= x) r--; a[l] = a[r]; while(l < r && a[l] >= x) l++; a[r] = a[l]; } a[l] = x; return l;}

左右交换

//分割数组int partition(int a[], int l, int r){ int begin = l;//记录比较元素的下标 int x = a[l]; while(l < r){ while(l < r && a[r] <= x) r--;//从右至左找到第一个小于比较元素的数 while(l < r && a[l] >= x) l++;//从左至右找到第一个大于比较元素的数 if(l < r) swap(a[l], a[r]);//将大数与小数交换 } swap(a[begin], a[l]);//将比较元素交换到期望位置 return l;//返回比较元素的位置}

三数取中优化

具体快排优化推荐这个博客:快速排序的4种优化

//三数取中(优化)int NumberOfThree(int a[], int l, int r){ int mid = (l + r) >> 1; if(a[mid] > a[r]) swap(a[mid], a[r]); if(a[l] > a[r]) swap(a[l], a[r]); if(a[mid] > a[l]) swap(a[l], a[mid]); return a[l];}

完整代码

#include using namespace std;int NumberOfThree(int a[], int l, int r){ int mid = (l + r) >> 1; if(a[mid] > a[r]) swap(a[mid], a[r]); if(a[l] > a[r]) swap(a[l], a[r]); if(a[mid] > a[l]) swap(a[l], a[mid]); return a[l];}int partition(int a[], int l, int r){ int begin = l; int x = NumberOfThree(a, l, r); while(l < r){ while(l < r && a[r] <= x) r--; a[l] = a[r]; while(l < r && a[l] >= x) l++; a[r] = a[l]; } a[l] = x; return l;}void quickSort(int a[], int l, int r){if(l >= r) return;int idx = partition(a, l, r);quickSort(a, l, idx - 1), quickSort(a, idx + 1, r);}int main(){int n;cin >> n;int a[n];for(int i = 0; i < n; i++) cin >> a[i];quickSort(a, 0, n - 1);for(int i = 0; i < n; i++) cout << a[i] << ' ';return 0;}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。