//快速排序
//选枢轴,左边的都比枢轴小,右边的都比枢轴大,左右两边不断向中间靠拢
//不断选枢轴,递归
#include <iostream>
using namespace std;
template <class T>
void QuickSort(T *a,const int left,const int right){
if(left < right){
//选枢轴
int i = left;
int j = right+1; //注意要加1
int pivot = a[left];
//划分算法
do{
do i++; while(a[i] < pivot); //左边找到一个比枢轴大的
do j--;while(a[j] > pivot); //右边找到一个比枢轴小的,
if(i<j) swap(a[i],a[j]); //左边和右边交换
}while(i<j);
swap(a[left],a[j]);
//递归
QuickSort(a,left,j-1); //对左半边递归快排
QuickSort(a,j+1,right); //对右半边递归快排
}
}
int main() {
int k[] = {23,12,8,45,99};//最后多加一个数,浪费了一个存储空间,但是提高了速度
QuickSort(k,0,3);
for(int i=0;i<5;i++)
cout << k[i]<<" ";
return 0;
}
优化后的快速排序:
#include <iostream> using namespace std; void print(int *arr, int n){ for(int i=0;i<n;i++) cout << arr[i] << " "; } int Partition(int *arr, int left, int right){ int l = left; int r = right; int temp = arr[r]; while(l != r){ while(arr[l] <= temp && l<r) l++; if(l<r){ arr[r] = arr[l]; r--; } while(arr[r] >= temp && l<r) r--; if(l<r){ arr[l] = arr[r]; l++; } } arr[l] = temp; return l; } void QuickSort(int *arr, int left, int right){ if(right <= left) return ; int pivot = (left + right)/2; swap(arr[pivot],arr[right]); pivot = Partition(arr,left,right); QuickSort(arr, left, pivot -1); QuickSort(arr, pivot + 1, right); } int main(){ int arr[8] = {34,2,5,42,6,9,23,65}; cout << "Before Sorted:"; print(arr,8); cout << endl << endl; QuickSort(arr,0,7); cout << "After sorted:"; print(arr,8); }