快速排序:
快速排序实则为冒泡排序的改进,与冒泡排序相比,其最差的情况下的时间复杂度和冒泡排序相同,但快速排序并不是一个稳定
的排序算法,例如多个相同值的位置有可能在排序之后会改变。
算法思想:
于数组中随机一个数为划分点,依次从数组的左右两边开始遍历查找大于以及小于划分点的数,并将两者交换位置。接着以交换
位置之后的数组从该划分点开始继续递归遍历交换直至结束。
示例:
以 4,9,6,5,1,2,23,14 为例
第一次:
2,1,4,5,6,9,23,14
第二次:
1,2 4, 5, 6,9,23,14
第三次:
1,2 4, 5, 6, 9,23,14
第四次:
1,2 4, 5, 6, 9, 23,14
第五次:
1,2 4, 5, 6, 9, 14,23
public static void main(String[] args) {
int arr[] = {4,9,6,5,1,2,23,14};
System.out.println("sort before:");
System.out.println(Arrays.toString(arr));
quickSort(arr, 0, arr.length-1);
System.out.println("after quickSort:");
System.out.println(Arrays.toString(arr));
}
/**
* 快速排序
* */
public static void quickSort(int[] arr, int former, int later) {
if(former<later)
{
int middle = getIntermediate(arr, former, later);
quickSort(arr, former, middle-1);
quickSort(arr, middle+1, later);
}
}
/**
* 将数组划分为两部分并返回划分点索引
* */
public static int getIntermediate(int[] arr, int former, int later) {
int inter = arr[former];
while (former < later) {
while(arr[later] > inter)
{
later --;
}
while(arr[former] < inter)
{
former ++;
}
if(former < later)
{
int t = arr[former];
arr[former] = arr[later];
arr[later] = t;
}
}
arr[former] = inter;
return former;
}