您的位置:首页 > 编程语言 > Java开发

快速排序及Java实现

2017-03-02 12:51 162 查看
算法概念

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

算法思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

实现思路

①以第一个关键字 K 1 为控制字,将 [K 1 ,K 2 ,…,K n ] 分成两个子区,使左区所有关键字小于等于 K 1 ,右区所有关键字大于等于 K 1 ,最后控制字居两个子区中间的适当位置。在子区内数据尚处于无序状态。

②把左区作为一个整体,用①的步骤进行处理,右区进行相同的处理。(即递归)

③重复第①、②步,直到左区处理完毕。

算法实现

此处采用三数中值分割法,即关键字由(start + end) / 2 得到。

/**
* 快速排序
* 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)
* 此处采用三数中值分割法
*
* @param a
* @return
*/
public static void quickSort(int[] a, int start, int end) {

if (end <= start) {
return;
}

int center = (start + end) / 2;
int i = start;
int j = end;
while (i < j) {
int tmp;
if (a[i] > a[j]) {
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}

if (a[i] > a[center]) {
tmp = a[i];
a[i] = a[center];
a[center] = tmp;
}
i++;

if (a[j] < a[center]) {
tmp = a[j];
a[j] = a[center];
a[center] = tmp;
}
j--;

}

if (end - start == 1) {
return;

}
quickSort(a, start, center);
quickSort(a, center, end);
}

public static void main(String[] args) {
int[] a = {5, 10, 4, 6, 9, 3, 2, 7, 10, 11};
quickSort(a, 0, a.length - 1);
for (int i : a) {
System.out.print(i + ",");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: