排序算法之快速排序及Java实现

一、排序算法的分类

  1. 选择排序(直接选择排序堆排序
  2. 交换排序(冒泡排序快速排序
  3. 插入排序(直接插入排序希尔排序
  4. 归并排序
  5. 桶式排序
  6. 基数排序

二、快速排序的原理

快速排序采用了分治的思想,将一个数组分成多个子数组,当子数组满足排序时,整个数组则已经排好序。它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
算法导论给出的伪代码如下所示:

关键部分在于partition的实现

示例如下

三、快速排序的实现


public class QuickSort {

    /**
     * 快速排序
     * 选择一个基准值,将比其小的值放在左边,比其大的值放在右边
     * 对新产生的数组左边和右边再递归以上动作
     * 直到所有子数组都已排好序
     * @param array 数组
     * @param start 开始节点
     * @param end 最后节点
     */
    public static void quiSort(int[] array, int start, int end) {
        if (start < end) {
            //递归遍历
            int position = partition(array, start, end);
            quiSort(array, start, position - 1);
            quiSort(array, position + 1, end);
        }
    }
    public static int partition(int[] array, int start, int end) {
        int position = start - 1;//开始时start前一个位置
        int base = array[end];//选择最后一个元素为基准
        for (int i = start; i < end; i++) {
            //从开始节点遍历
            if (array[i] <= base) {
                position++;
                //第i个元素和position位置元素交换位置
                int temp = array[position];
                array[position] = array[i];
                array[i] = temp;
            }
        }
        //最后一个元素与position交换位置
        int temp = array[position + 1];
        array[position + 1] = array[end];
        array[end] = temp;
        //返回基准所在的位置
        return position + 1;
    }

    public static void main(String args[]){
        int[] test = {3,2,5,10,8,6,1};
        quiSort(test,0,test.length-1);
        for(int i=0;i<test.length;i++){
            System.out.print(test[i] + " ");
        }
    }
}

测试结果:

1 2 3 5 6 8 10 

猜你喜欢

转载自blog.csdn.net/xdzhouxin/article/details/80031668