快速排序

空扰寡人 提交于 2020-01-15 10:25:11
public static void main(String[] args) {
    int[] array={49,38,65,97,76,13,27,50,78,34,12,64,1};
    myQuickSort(array,0,array.length-1);

    System.out.println("排序之后:");
    for(int i=0;i<array.length;i++){
        System.out.print(array[i]+" ");
    }
    System.out.println();
}

/**
 * 快排,是递归的,一个数组先进行一次轴划分成两个区,
 * 然后以轴为中心把左边的和右边都认为是一个新的数组再次进行快排
 * @param array
 * @param low
 * @param hight
 */
public static void myQuickSort(int[] array,int low,int hight){
    if(low<hight){
        int axis = myFirstQuickSort(array, low, hight);//进行第一轮排序
        myQuickSort(array,axis+1,hight);//右边认为是一个新的数组,进行快排
        myQuickSort(array,low,axis-1);//左边的认为是一个新的数组,进行快排
    }
}

/**
 * 这只是一个数组快速排序的第一轮,目标是在low和higth之间,由low的值key作为轴,小于key的放到前面,大于的放到后面
 * 当low==hight时就比较完了,也是最后key的位置
 *
 * 由于初始化时key=low.value,所以先从hight开始,如果key小于hight.value直接移动指针,否则就直接交换位置,
 * 这个时候先把low指针后移,然后在开始比较,防止low==hgith的情况
 *
 * 和上段类似
 * key再值交换时不用进行赋值,因为key是不变得,而且这个值肯定会被hight位或者low位,再或者本位替换掉
 * 返回轴最后的位置,后面轴的左边和右边都会再次进行排序
 *
 * @param array
 * @param low
 * @param hight
 */
public static int myFirstQuickSort(int[] array,int low,int hight){
    int key=array[low];
    while (low<hight){
        while (low<hight && key<array[hight]){
            hight--;
        }
        array[low]=array[hight];
        low++;
        while (low<hight && key>array[low]){
            low++;
        }
        array[hight]=array[low];
        hight--;
    }
    array[low]=key;
    return low;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!