数据结构算法——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] <<" "; }
下一篇:
学习设计模式有什么用?