关键词

快速排序算法原理及java递归实现

快速排序算法原理及java递归实现

快速排序是一种常用的排序算法,最好的情况下时间复杂度为 O(nlogn)。快速排序采用分治法的思想,具体过程如下:

1.选定一个基准元素,通常选择第一个或最后一个元素;

2.设置两个指针,一个指向起始位置,一个指向终止位置;

3.从后往前查找,找到第一个小于基准元素的位置并记录下来;

4.从前往后查找,找到第一个大于基准元素的位置并记录下来;

5.交换这两个位置上的元素;

6.继续向后查找并交换元素,直到左右指针相遇;

7.经过以上步骤后,所有小于基准元素的元素都在左侧,大于基准元素的元素都在右侧;

8.递归地对左右两侧进行快速排序。

Java递归实现代码

public static void quickSort(int[] arr, int left, int right){
    if(left >= right){
        return;
    }
    int index = partition(arr, left, right);
    quickSort(arr, left, index-1);
    quickSort(arr, index+1, right);
}

public static int partition(int[] arr, int left, int right){
    int pivot = arr[left];
    int i = left + 1;
    int j = right;
    while(i <= j){
        while(i <= j && arr[i] < pivot){
            i++;
        }
        while(i <= j && arr[j] > pivot){
            j--;
        }
        if(i <= j){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }
    arr[left] = arr[j];
    arr[j] = pivot;
    return j;
}

示例说明

假设现在有一个无序数组 {6, 2, 9, 3, 7},进行快速排序的过程如下:

1.首先选定基准元素为6,即数组的第一个元素;

2.设置左指针l为2,右指针r为7;

3.从后往前查找,找到第一个小于6的元素,即3,将3与6交换位置;此时数组变为{3, 2, 9, 6, 7};

4.从前往后查找,找到第一个大于6的元素,即9,将9与6交换位置;此时数组变为{3, 2, 6, 9, 7};

5.左指针l=2,右指针r=8,继续步骤3,找到第一个小于6的元素2,将2与6交换位置;此时数组变为{3, 2, 6, 9, 7};

6.左指针l=3,右指针r=6,左右指针相遇,一轮排序完毕;

7.递归地对左侧数组{3, 2}和右侧数组{9, 7}重复以上步骤,直到数组有序。

此时数组变为 {2, 3, 6, 7, 9}。

在实现过程中,还需要考虑一些细节问题,例如如何选择基准元素,以及如何处理重复元素等,但基本的思想和实现方法和上面介绍的是一样的。

本文链接:http://task.lmcjl.com/news/13243.html

展开阅读全文