经典算法之快速排序
说明:
快速排序是目前公认最快的排序方法之一。大部分情况都表现得很好,但当必须考虑最坏情况时,快速排序不可接受,因为时间达到O(n2)。
思路:
快速排序的基本思想是在数列中找出适当的轴心,将数列分成左右两部分(左半部分的元素都小于右半部分的元素),然后分别对两部分进行排序(重覆选择轴心,划分左右部分的过程)。
以中间元素为轴(用p表示)进行处理的步骤:
1、 令索引i从左向右找,直到找到大于p的数。
2、 令索引j从右向左找,直到找到小于p的数。
3、 如果i>=j,跳到第五步。
4、 否则,交换i、j两处元素的值。
5、 对左边重覆上面的步骤。
6、 对右边重覆上面的步骤。
注意:轴心的选择对快速排序的效率有影响,但以中间元素为轴心的算法较容易理解。
核心代码:
代码
//以中间元素为轴
private static void sort2(int[] array, int left, int right) {
if (left < right) {
int p = array[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true) {
while (array[++i] < p)
;
while (array[--j] > p)
;
if (i >= j)
break;
swap(array, i, j);
}
sort(array, left, i - 1);
sort(array, j + 1, right);
}
}
private static void sort2(int[] array, int left, int right) {
if (left < right) {
int p = array[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true) {
while (array[++i] < p)
;
while (array[--j] > p)
;
if (i >= j)
break;
swap(array, i, j);
}
sort(array, left, i - 1);
sort(array, j + 1, right);
}
}
全部代码:
代码
package com.icescut.classic.algorithm.sort;
public class QuickSort {
public static void main(String[] args) {
int[] array = { 10, -3, 5, 34, -34, 5, 0, 9 }; // test data
sort2(array, 0, array.length - 1);
for (int el : array) {
System.out.print(el + " ");
}
}
//以左边元素为轴承
private static void sort(int[] array, int left, int right) {
if (left < right) {
int p = array[left];
int i = left;
int j = right + 1;
while (true) {
while (i + 1 < array.length && array[++i] < p)
;
while (j - 1 > -1 && array[--j] > p)
;
if (i >= j)
break;
swap(array, i, j);
}
array[left] = array[j];
array[j] = p;
sort(array, left, j - 1);
sort(array, j + 1, right);
}
}
//以中间元素为轴
private static void sort2(int[] array, int left, int right) {
if (left < right) {
int p = array[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true) {
while (array[++i] < p)
;
while (array[--j] > p)
;
if (i >= j)
break;
swap(array, i, j);
}
sort(array, left, i - 1);
sort(array, j + 1, right);
}
}
private static void swap(int[] number, int i, int j) {
int t = number[i];
number[i] = number[j];
number[j] = t;
}
}
public class QuickSort {
public static void main(String[] args) {
int[] array = { 10, -3, 5, 34, -34, 5, 0, 9 }; // test data
sort2(array, 0, array.length - 1);
for (int el : array) {
System.out.print(el + " ");
}
}
//以左边元素为轴承
private static void sort(int[] array, int left, int right) {
if (left < right) {
int p = array[left];
int i = left;
int j = right + 1;
while (true) {
while (i + 1 < array.length && array[++i] < p)
;
while (j - 1 > -1 && array[--j] > p)
;
if (i >= j)
break;
swap(array, i, j);
}
array[left] = array[j];
array[j] = p;
sort(array, left, j - 1);
sort(array, j + 1, right);
}
}
//以中间元素为轴
private static void sort2(int[] array, int left, int right) {
if (left < right) {
int p = array[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true) {
while (array[++i] < p)
;
while (array[--j] > p)
;
if (i >= j)
break;
swap(array, i, j);
}
sort(array, left, i - 1);
sort(array, j + 1, right);
}
}
private static void swap(int[] number, int i, int j) {
int t = number[i];
number[i] = number[j];
number[j] = t;
}
}

浙公网安备 33010602011771号