快速排序
思想:
选定数列里面的第一个数字或者最后一个数字为基准数(pivot),把剩余的数字中小于基准数的放在基准数的左侧,其他放在右侧,然后递归处理左侧子数列和右侧子数列。
举例:(取第一个数字为基准数字)
数列:6, 9, 3, 2, 7, 1
第一轮结果:3, 2, 1, 6, 9, 7
第二轮结果:2, 1, 3, 6, 7, 9
第三轮结果:1, 2, 3, 6, 7, 9
我第一次写代码时,借助了一个临时数组,这样就非常简单,循环原数组,把小的从头部写入临时数组,大的从尾部写入临时数组,最后把基准数放到剩下的位置。然后递归处理。
后来我看了维基百科的例子,不借助临时数组,相对巧妙,所以记录下来,供大家参考。
package cn.tx.algorithm.quicksort;
public class Quicksort {
public static void swap(int[] arr,int a,int b)
{
int c = arr[a];
arr[a] = arr[b];
arr[b] = c;
}
public static void qsort(int[] arr,int nStart, int nEnd) {
if(nStart >= nEnd)
return;
int nPivot = arr[nStart];
int i = nStart;
int j = nEnd + 1;
while(true) {
while (arr[++i] < nPivot) {
if (i >= nEnd)
break;
}
while (arr[--j] > nPivot) {
if (j <= nStart)
break;
}
if (i < j)
swap(arr, i, j);
else
break;
}
swap(arr,nStart,j);
qsort(arr,nStart,j - 1);
qsort(arr,j + 1,nEnd);
}
public static void main(String[] args) {
int[] array = {6,9,3,2,7,1};
qsort(array,0,array.length - 1);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + ",");
}
}
}
本文深入解析了快速排序算法的原理及实现过程,通过实例演示如何选取基准数并进行递归分区,提供了一种不使用额外数组的高效排序方法。
454

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



