快速排序的思想 (基于分治法):
每次选一个基准元素x,通过一次遍历将排序表划分为独立的两部分a[l,k-1],a[k+1,r];
其中左边的元素<=x,右边的1元素>x,然后递归下去,直到每个块的大小为1 ;
c++
#include<bits/stdc++.h>
using namespace std ;void quickSort(vector<int>& q,int l,int r){if (l >= r) return;//设置分界点int x = q[l + r >> 1];//调整区间int i = l - 1, j = r + 1;while (i < j) {//-查找分界点左侧大于等于分界点的值do ++i; while (q[i] < x);//-查找分界点右侧小于等于分界点的值do --j; while (q[j] > x);//-交换位置if (i < j) {int temp = q[i];q[i] = q[j];q[j] = temp;}}//对左侧递归排序quickSort(q, l, j);//对右侧递归排序quickSort(q, j + 1, r);
}int main(){int n ; cin >> n ;vector<int> a(n) ;for(int& x : a) cin >> x ;quickSort(a,0,n-1) ;for(int& x : a) cout << x << " " ;
}
java
package sf;import java.util.Scanner;public class quicksort {public static void quickSort(int[] q, int l, int r) {if (l >= r) return;//设置分界点int x = q[l + r >> 1];//调整区间int i = l - 1, j = r + 1;while (i < j) {//-查找分界点左侧大于等于分界点的值do ++i; while (q[i] < x);//-查找分界点右侧小于等于分界点的值do --j; while (q[j] > x);//-交换位置if (i < j) {int temp = q[i];q[i] = q[j];q[j] = temp;}}//对左侧递归排序quickSort(q, l, j);//对右侧递归排序quickSort(q, j + 1, r);}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] q = new int[n];for (int i = 0; i < n; i++) {q[i] = sc.nextInt();}quickSort(q, 0, n -1);for (int value : q) {System.out.print(value + " ");}}
}