您的位置:首页 > 编程语言 > Java开发

Java排序算法(四):快速排序

2015-03-23 18:37 267 查看
Java排序算法(四):快速排序



快速排序是一个速度非常快的交换排序算法,它的基本思路很简单,从待排的数据序列中任取一个数据(如第一个数据)作为分界值,所有比它小的数据元素放到左边,所有比它大的数据元素放到它的右边。经过这样一趟下来,该序列形成左右两个子序列,左边序列中的数据元素的值都比分界值小,右边序列中数据元素的值都比分界值大。

接下来对左右两个子序列进行递归排序,对两个子序列重新选择中心元素并依此规则调整,直到每个元素子表的元素只剩下一个元素,排序完成。

思路:

1.定义一个i变量,i变量从左边第一个索引开始,找大于分界值的元素的索引,并用i来记录它。

2.定义一个j变量,j变量从右边第一个索引开始,找小于分界值的元素的索引,并用j来记录它。

3.如果i<j,交换i,j两个索引处的元素。

重复执行以上1,2,3步,直到i>=j,可以判断j左边的数据元素都小于分界值,j右边的数据元素都大于分界值,最后将分界值和j索引处的元素交换即可。

时间复杂度

最好情况(每次总是选到中间值作枢轴)T(n)=O(nlogn)

最坏情况(每次总是选到最小或最大元素作枢轴)

做n-1趟,每趟比较n-i次,总的比较次数最大:[O(n²)]

平均时间复杂度为::T(n)=O(nlogn)

代码实现:

[java] view
plaincopyprint?

package sort;  

  

public class QuickSortTest {  

  

    public static void main(String[] args) {  

        int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };  

        print(data);  

        quickSort(data, 0, data.length - 1);  

        System.out.println("排序后的数组:");  

        print(data);  

    }  

  

    public static void swap(int[] data, int i, int j) {  

        if (i == j) {  

            return;  

        }  

        data[i] = data[i] + data[j];  

        data[j] = data[i] - data[j];  

        data[i] = data[i] - data[j];  

    }  

  

    public static void quickSort(int[] data, int start, int end) {  

        if (start >= end)  

            return;  

        //以起始索引为分界点  

        int pivot = data[start];  

        int i = start + 1;  

        int j = end;  

        while (true) {  

            while (i <= end && data[i] < pivot) {  

                i++;  

            }  

            while (j > start && data[j] > pivot) {  

                j--;  

            }  

            if (i < j) {  

                swap(data, i, j);  

            } else {  

                break;  

            }  

        }  

        //交换 j和分界点的值  

        swap(data, start, j);  

        print(data);  

        //递归左子序列  

        quickSort(data, start, j - 1);  

        //递归右子序列  

        quickSort(data, j + 1, end);  

    }  

  

    public static void print(int[] data) {  

        for (int i = 0; i < data.length; i++) {  

            System.out.print(data[i] + "\t");  

        }  

        System.out.println();  

    }  

  

}  

运行结果:

[java] view
plaincopyprint?

5   3   6   2   1   9   4   8   7     

1   3   4   2   5   9   6   8   7     

1   3   4   2   5   9   6   8   7     

1   2   3   4   5   9   6   8   7     

1   2   3   4   5   7   6   8   9     

1   2   3   4   5   6   7   8   9     

排序后的数组:  

1   2   3   4   5   6   7   8   9  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息