Java-快速排序

1.原理/思路

快速排序一般基于递归实现。其思路是这样的:
1.选定一个合适的值(理想情况中值最好,但实现中一般使用数组第一个值),称为“枢轴”(pivot)。
2.基于这个值,将数组分为两部分,较小的分在左边,较大的分在右边。
3.可以肯定,如此一轮下来,这个枢轴的位置一定在最终位置上。
4.对两个子数组分别重复上述过程,直到每个数组只有一个元素。
5.排序完成。

2.分析做法

1.附设两个指针left和right,初始化时分别指向数组的下界和上界,设枢轴关键字为pivotloc
(第一趟 left = 0 ,right = arr.length - 1)
2.从表的最右侧位置,依次向左搜索找到第一个关键字小于pivotloc的记录和枢轴记录交换。具体操作:当left<right时,
如果arr[right]的值大于等于pivotloc,则向左移动指针right(--right);否则将arr[right]与枢轴记录交换。
3.从表的最左侧位置,依次向右搜索找到第一个关键字大于pivotloc的记录和枢轴记录交换。具体操作:当left<right时,
如果arr[left]的值小于等于pivotloc,则向右移动指针left(--left);否则将arr[left]与枢轴记录交换。
4.重复步骤2 和3,直到left和right相等为止,此时left或right的位置即为枢轴在此排序中的最终位置,原表被分成两个字表。

3.代码实现

public int[] quickSort(int[] arr){
    QSort(arr,0,arr.length - 1);
    return arr;
}

public void QSort(int[] arr,int left,int right){

    if(left < right){
        //枢轴位置
        int pivotloc = partition(arr,left,right);
        //左字表递归排序
        QSort(arr,left,pivotloc-1);
        //又字表递归排序
        QSort(arr,pivotloc+1,right);
    }

}

private int partition(int[] arr, int left, int right) {

    //枢轴记录
    int pivotloc = arr[left];
    //表的两端交替向中间扫描
    while (left < right){
        while (left < right && arr[right] >= pivotloc){
            --right;
        }
        //将比枢轴小的记录移到左端
        arr[left] = arr[right];

        while (left < right && arr[left] <= pivotloc){
            ++left;
        }
        //将比枢轴大的记录移到右端
        arr[right] = arr[left];
    }
    //扫描完成,枢轴到位
    arr[left] = pivotloc;
    //返回的是枢轴的位置
    return left;
}

4.测试

@Test
public void test(){
    int arr[] = {0,1,1,2,3,3,4,8,7,6,12,22,65};
    //        int arr[] = {6,3,8,2,9,1};
    System.out.println("排序前");
    printArr(arr);

    int[] data = quickSort(arr);

    System.out.println("排序后");
    printArr(data);
}

public void printArr(int[] arr){
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i]+" ");
    }
    System.out.println();
}

5.总结

 快速排序在大多数情况下都是适用的,尤其在数据量大的时候性能优越性更加明显。
 特点:
     1.记录非顺次地移动导致排序方法是不稳定的。
     2.排序过程中需要定位表的下界和上界,所以适合用于顺序结构,很难用于链式结构。
     3.适合初始记录无序,n较大的情况,当n较大时,在平均情况下快速排序是所有内部排序中速度最快的一种。

猜你喜欢

转载自blog.csdn.net/rjgcszlc/article/details/79751208