算法实战java实现快速排序

来源:互联网 发布:2017人工智能产业规模 编辑:程序博客网 时间:2024/06/15 09:16

快排原理介绍

这里写图片描述
在数组s中随便选出一数,做为枢纽值x。
这里写图片描述
s1和s2
大小不必相等。递归的向s1和s2使用上面的方法,结合起来就拍好序了。

注意:

在实际应用中数组的数量小于20,插入排序的速度快与快速排序。

java实现

public class QuickSort {    private final int CUTOFF = 20;    void quicksort( int[] list) {        quicksort( list, 0, list.length - 1);    }    void quicksort( int[] list, int left, int right) {        if (left + CUTOFF <= right)        {            //得到枢纽元            int pivot = median3(list, left, right);            int i = left;            int j = right-1;            for( ; ; )            {                //当俩个指针都停下时,进行交换                while ( list[++i] < pivot) {}                while ( list[--j] > pivot) {}                //检查是否越界                if (i < j)                    swap(list, i, j);                else                    break;            }            //将枢纽元放回i所在位置            swap(list, i, right - 1);            //递归调用            quicksort( list, left, i - 1);            quicksort( list, i+ 1, right);            }        else             inserSort( list, left, right);    }    //将首尾中3个数进行排序并返回中值    int median3( int[] list, int left, int right) {        int center = (left + right ) / 2;        //若center值小于left值,二者交换        if (list[center] < list[left])            swap( list, left, center);        //若right值小于left值,二者交换        if (list[right] < list[left])            swap( list, left, right);        //若right值小于center值,二者交换        if (list[right] < list[center])            swap( list, center, right);        //最终结果为left, center,right值从小到大排列        //将中值于倒数第二个值交换        swap( list, center, right-1);        //返回中值        return list[ right - 1 ];           }    //交换数组中的位置    void swap( int[] list, int left, int right) {        int temp = list[left];        list[left] = list[right];        list[right] = temp;      }    //直接插入排序,由小到大       void inserSort( int[] list, int left, int right) {        int j;        for( int p = left; p <= right; p++ ) {            int temp = list[p];            //比较当前位置与前面一个的大小, 如果当前位置较小与前一个交换。            for ( j = p;  j > 0 && temp - list[ j - 1] < 0; j--)                list[j] = list[j-1];            list[j] = temp;        }    }   }
原创粉丝点击