数据结构算法——1055. 快速排序的优化
题目
思路
当给一个基本逆序,或者基本有序的数组中,快速排序会退化成选择排序 所以我们除了题目提示给的思路之外 还可以先把各个小的部分(比如每个部分只有50个元素)进行插入排序,让整个数组不那么逆序再进行快排操作,可以大大缩减快排(避免退化成选择排序)的操作时间
代码
#include<iostream>
using namespace std;
void choosesort(int* arr, int left, int right)
{
for(int i = left; i <= right; i++)
{
int min = arr[i];
int pos = i;
for(int j = i + 1; j <= right; j++)
{
if(arr[j] <= min)
{
min = arr[j];
pos = j;
}
}
arr[pos] = arr[i];
arr[i] = min;
}
}
int compare_mid(int* arr, int left, int right)
{
int mid = (left + right) / 2;
if( (arr[mid] <= arr[right] && arr[mid] >= arr[left]) ||
(arr[mid] >= arr[right] && arr[mid] <= arr[left]) )
return mid;
if( (arr[left] <= arr[right] && arr[mid] <= arr[left]) ||
(arr[left] >= arr[right] && arr[mid] >= arr[left]) )
return left;
else
return right;
}
void quicksort(int* arr, int left, int right)
{
int a = left, b = left + 40;
while(b < right)
{
choosesort(arr,a,b);
a += 40; b += 40;
}
if(right - left < 30)
choosesort(arr, left, right);
else
{
int pivot = compare_mid(arr,left,right);
int temp = arr[pivot];
//cout << temp <<" ? " << arr[left] << " " << arr[right] << endl;
arr[pivot] = arr[left];
arr[left] = temp;
int l = left, r = right, com = arr[left];
while(l < r)
{
while(l <= r && arr[r] >= com)
r--;
if(l < r)
arr[l++] = arr[r];
while(l < r && arr[l] < com)
l++;
if(l <= r)
arr[r--] = arr[l];
}
arr[l] = temp;
// for(int i = left; i <= right; i++)
// cout << arr[i] << " ";
// cout << endl;
quicksort(arr, left, l - 1);
quicksort(arr, l + 1, right);
}
}//
int main()
{
int n;
cin >> n;
int* arr = new int[n];
for(int i = 0; i < n; i++)
cin >> arr[i];
quicksort(arr, 0, n - 1);
for(int i = 0; i < n; i++)
cout << arr[i] <<" ";
}
下一篇:
学习设计模式有什么用?
