快速排序算法

基本思想

  本文以从小到大排序的方式进行讲解。

  快速排序的基本思想是任取待排序序列的一个元素作为中心元素(可以用第一个,最后一个,中间的任意一个),称之为枢轴元素,pivot。

    1)将数组中所有比pivot小的放左边;

    2)将数组中所有比pivot大的放右边;

    3)形成左右两个子表

    4)然后对左右两个子表再按照前面的算法进行排序,直到每个子表的元素只剩下一个。

  快速排序是用到了分而治之的思想,将一个数组分成两个数组的方法为:

    1)先从数组右边找到一个比pivot小的元素,将数组的第一个位置赋值给该元素。

    2)再从数组的左边找到一个比pivot大的元素,将从上面取元素的位置赋值为该值。

    3)依次进行,直到左右相遇,把pivot赋值到相遇位置。

示例

输入数组

array为 [ 30,20,50,80,60,3,10,40]

快速排序算法

 

 将30定义为pivot,查询左边的元素为left,初始值为第一个元素的索引【0】;查询右边的元素为right,初始值为最后一个元素的索引【7】。

快速排序算法

 

 

首轮排序:

从右边开始,找到第一个比pivot小的元素,如果没找到对right一直自减1;

找到则将该值赋值给pivot位置;并且空余该位置。

快速排序算法

 

 然后从左边开始找一个比pivot大的元素;如果没有则left一直自增1;

找到后,将该值赋值给上一步中空余的位置。

快速排序算法

 

 重复上述操作,直至left光标与right光标相遇,并将pivot的值,赋值给光标位置。

快速排序算法

 

 然后将数组分成俩部分:[10,20,3],[60,80,50,40]

再进行上述流程,反复直至最后一个元素。

快速排序算法

 

 

代码

对每一个数组进行分化的代码如下:

初始化pivot为数组的第一个元素;

只要left还小于right就进行循环;

外层循环内部如下:

先从右边找一个比pivot小的元素;

将当前left所指元素赋值为找到的元素;

再从左边找一个比pivot大的元素;

将当前right所指元素赋值为找到的元素;

当left与right相等,将pivot赋值在此;

最后返回中间元素的索引。

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

快排代码:
第一个是快排的重载,直接传数组;
然后调用另一个重载函数,传数组,left为第一个元素索引0,right为最后一个元素索引数组长度减去1;
主要介绍传三个参数的快排函数:
定义一个将来划分为两个数组的中间元素的索引;
如果left比right小,进行一次划分,将返回来的值赋值给middle;
对left到middle - 1的部分进行一次快排(递归进行);
对middle + 1到right的部分进行一次快排(递归进行)。

middle + 1到right的部分进行一次快排(递归进行)。

public static void quickSort(int[] arr){
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    public static void quickSort(int[] arr,int left,int right){
        int middle;
        if(left < right){
            middle = partition(arr,left,right);
            quickSort(arr,left,middle-1);
            quickSort(arr,middle+1,right);
        }
    }

  

完整代码:

import java.util.Arrays;

public class Solution {
    public static void main(String[] args) {
        quickSort(new int[]{39,28,55,87,66,3,17,39});
    }

    public static void quickSort(int[] arr){
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    public static void quickSort(int[] arr,int left,int right){
        int middle;
        if(left < right){
            middle = partition(arr,left,right);
            quickSort(arr,left,middle-1);
            quickSort(arr,middle+1,right);
        }
    }

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

  

 

快速排序算法

上一篇:ATI Radeon HD 5450 with full QE/CI Support ( 转载 )


下一篇:一张图告诉你,只会这些HTML还远远不够!!!!!