快速排序学习的这个版本的特点是:
1.原地排序
2.采用了分治法
3.采用递归
伪代码:
quick_sort(arr, low, high) i <-low, j <- high; mid <- (i+j)/2; 实现从小到大排 //设置哨兵 pivot <- arr[mid]; while i<= j 从左向右寻找大于哨兵的元素,当然小于哨兵的就是无需排序的 while arr[i] < pivot ++i; 从右向左寻找小于哨兵元素 while arr[j] > pivot --j; 把寻找到的无序值进行交换并更新i,j if i <= j swap(arr[i],arr[j]); ++i,--j;
while循环结束的条件是i>j 进行递归 if(low < i-1) quick_sort(arr, low, i-1) if(i < rigth) quick_sort(arr, i, high)
C++实现:
#include<iostream> //交换数据 inline void my_swap(int &a, int &b) { int temp = a; a = b; b =temp; } //快速排序 void quick_sort(int *arr,int low,int high) { int i = low, j = high; int pivot = arr[(i+j)/2]; while(i <= j) { while(arr[i] < pivot) ++i; while(arr[j] > pivot) --j; if (i <= j) { my_swap(arr[i],arr[j]); ++i; --j; } } if(low < i-1) quick_sort(arr,low,i-1); if(i < high) quick_sort(arr,i,high); } //打印数组 void dis_arr(int *a, int n) { std::cout << "The array is: "; for (int i = 0; i< n;++i) { std::cout << a[i] << " "; } std::cout << std::endl; } int main() { int arr[] = {1,-1,90,20,8,-80,-700}; int n = sizeof(arr)/sizeof(*arr); dis_arr(arr,n); quick_sort(arr,0,n-1); dis_arr(arr,n); }