快速排序的基本思想:运用分而治之的思想,通过一趟排序将待排序的序列分成两段,分成的两段中,一段永远比另一段的数据要大.不断重复这一过程,直到全部数据有序.整个过程可以用递归实现.
快速排序是冒泡排序的改进版本,它的思想是通过一趟排序将待排序的记录分隔成独立的两部分,其中一部分记录的关键字均小于另一部分关键字,则可以分别对这两部分记录继续进行排序,以达到整个序列的有序。
假设待排序的序列{L.r[s],L.r[s+1],.......,L.r[t]]},首先选取一个记录(通常可一选择中间位置的记录L.r[mid])作为枢轴(或支点),然后按照下述原则重新排列其他记录,将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较它大的记录都安置在它的位置之后。由此可以该 “枢轴” 记录最后所落的位置i作为分界,将序列{L.r[s],L.r[s+1],.......,L.r[t]]} 分隔成了两个子序列{L.r[s],L.r[s+1],.......,L.r[i-1]]} 和 {L.r[i+1],L.r[s+1],.......,L.r[t]]},这个过程叫作一趟快速排序(或者一次划分)。
一趟快速排序序的具体做法是:附设两个指针low和high,他们的初值分别为low和high,设枢轴记录的关键字为privotkey,则首先从high所指位置向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互相交换,然后从low所指向的位置起向后搜索,找到第一个关键字大于privotkey的记录和枢轴记录互相交换,重复这两步直至low==high位置。
public class Quicksort {
private int getPivot(int begin, int end) {
return (begin + end) >> 1;
}
// 一次排序
private int partition(int[] array, int begin, int end) {
int pivot = getPivot(begin, end);
int tmp = array[pivot];
array[pivot] = array[end];
while (begin != end) {
while (array[begin] < tmp && begin < end)
begin++;
if (/* array[begin] > tmp && */begin < end) {
array[end] = array[begin];
end--;
}
while (array[end] > tmp && end > begin)
end--;
if (/* array[end] < tmp && */end > begin) {
array[begin] = array[end];
begin++;
}
}
// 此时两个下标指向同一个元素.以这个位置左右分治(分治点)
array[begin] = tmp;
return begin;
}
private void qsort(int[] array, int begin, int end) {
if (end - begin < 1)
return;
int pivot = partition(array, begin, end);
qsort(array, begin, pivot);
qsort(array, pivot + 1, end);
}
public void sort(int[] array) {
qsort(array, 0, array.length - 1);
}
public static void main(String[] args) {
int[] array = { 3, 2, 2, 2, 3, 1, 4, 5, 1 };
new Quicksort().sort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ", ");
}
}
}
58万+

被折叠的 条评论
为什么被折叠?



