快速排序的核心思想是:
根据基准数分组,分成两组,左边的都比基准数小,右边的都比基准数大;分组之后,对组内数据进行排序。
举个例子:比如有下面一组数据,
1.选取基准数,以第一个数为基准数,即55为基准数,从前往后比较,得到以下数据:
这串数据是基准数55与右边最后一个数比较,55比12大,然后交换位置,
2.然后基准数从后往前比较,得到以下数据:
- 重复步骤1和步骤2,得到以下数据
直到基准数前面的数都比基准数小,基准数后面的数都比基准数大,然后以基准数分组,每组都重复上面的步骤。
以上以55前后分两组
下面上代码
public static void qSort(int data[], int left, int right) { // 从左边找的位置 int ll = left; // 从右边找的位置 int rr = right; // 取第一个作为基准数 int base = data[left]; //Sort // 1 2 3 4 5 while (ll < rr) { // 从后面往前找到比基准数小的数进行对换 while (ll < rr && data[rr] >= base) { rr--; } // 为了怕是 没找到 if (ll < rr) { int temp = data[rr]; data[rr] = data[ll]; data[ll] = temp; ll++; } // 从前面往后面找比基准数大的进行对换 while (ll < rr && data[ll] <= base) { ll++; } if (ll < rr) { int temp = data[rr]; data[rr] = data[ll]; data[ll] = temp; rr--; } } System.out.println("以Base=" +base+ "的排序结果"); print(data); // 以基准数分为3部分,左边的比之小,右边比之大 我们要做的就是一把这左边和右边分别进行快速排序 if (ll > left) { qSort(data, left, ll - 1); } if (rr < right) { qSort(data, ll+1, right); } } public static void print(int data[]) { for (int i = 0; i < data.length; i++) { System.out.print(data[i] + " "); } System.out.println(); } public static void main(String[] args) { int data[] = { 55 ,28 ,78 ,80 ,50 ,17 ,100 ,12 }; qSort(data, 0, data.length - 1); print(data); }