一、综述
快速排序是交换排序中的一种,平均算法复杂度是O(nlogn),最坏O(n*n)。下面用Java实现一个快速排序,并用注释的方式解释了思想和原理。
二、Java实现堆排序
package com;
/**
* @author 王勤为
*
* 这个是实现快速排序的类
*
* 快速排序的基本思想是分治法:
*
* 1.先从数列中取出一个数作为基准数。
*
* 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
*
* 3.再对左右区间重复第二步,直到各区间只有一个数。
*
*
*/
public class AQuickSort {
public static void quickSort(int[] a, int left, int right) {
if (left == right | left > right) { // 终止条件
return;
}
int i = left, j = right; // 定义两个指针,一个从左往右遍历,一个从右往左遍历
int x = a[left]; // 定义基准数,默认 是数组第一个
while (i < j) {
while (a[j] >= x & i < j) { // 如果j指向的数比基数大,继续往左移动指针
j--;
}
while (a[i] <= x & i < j) { // 如果i指向的数比基数小,继续往右移动指针
i++;
}
swap(a, i, j);
}
// 以上代码过后 i==j 此时,把基数和i指向的数交换位置
swap(a, left, i);
// 递归处理基数左边的数列和右边的数列
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}
// 交换元素的方法
public static void swap(int[] a, int left, int right) {
if (a == null | left == right | a.length < 2)
return;
int temp = a[left];
a[left] = a[right];
a[right] = temp;
}
}
public class maintest {
public static void main(String[] args) {
int[] a = { 45, 6, 43, 78, 12, 90, 23, 21, 41, 64, 31, 91, 81, 6,45,89,43,12,13,33,99,456,789 };
AQuickSort.quickSort(a, 0, a.length-1);
for (int e : a) {
System.out.print(e + " ");
}
}
}
//调用输出结果为:6 6 12 12 13 21 23 31 33 41 43 43 45 45 64 78 81 89 90 91 99 456 789