快速排序

day8

快速排序

方法:

1,设置一个基准数,一般是数组(int [] arr)的最左边的那个数,不能仅仅理解为是arr[0];

2.检索,先从右边开始检索,遇到比基准数小的,就停下来;

再从左边开始检索,遇到比基准数大的,就停下来;

3.交换,将左右两边的元素交换

4.继续检索

5.当左右两边相遇,就将基准数和相遇位置的元素交换;

6.结束第一轮排序

7.继续排基准数左边的数组,然后排右边的数组

 

下面是实现代码:

package Sort.Search;

public class QuitSort2 {
   public static void main(String[] args) {
   int[] arr= {4,5,6,2,9,8,3};

       for (int i = 0; i < arr.length; i++) {
           System.out.print(arr[i] + " ");
      }


       System.out.println();

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


       for (int i = 0; i < arr.length; i++) {
           System.out.print(arr[i] + " ");
      }
  }


   public static  void quickSort(int[] arr, int left, int right) {

       if(left > right){ //没有这段会出现下标越界
           return;
      }
      int base = arr[left]; //定义一个基准数,
       int i = left;
       int j = right;




       while(i != j){

           while(i < j &&arr[j] >= base ){//从数组右边开始检索,比基准数大或者相等,则继续从右向左移动
               j--;                //j从右向左移动
          }

           while(i< j &&arr[i] <= base ){//从数组左边向右开始检索,大于或者小于基准数,则继续向右移动
               i++;//i从左向右移动
          }
           //当i和j 都停止了循环,说明arr[j]小于基准数,arr[i]大于基准数
           //将arr[i]和arr[j]交换
           int temp = arr[i];
           arr[i] = arr[j];
           arr[j] = temp;


      }
       //当i和j相等时,跳出循环
       //将arr[left]和arr[i]或者arr[j]交换
       arr[left] = arr[i];
       arr[i] = base;

       //第一轮循环结束,经行下一轮排序
       quickSort(arr,j+1,right);//从基数的右边开始排序
       quickSort(arr,left,i-1);//从基数的左边开始排序




  }

}

注:

当时,我写代码时,忘记判断一直出现数组下标越界。希望读者注意

if(left > right){
                   //没有这段会出现下标越界    
return;}

 

原文地址:https://www.cnblogs.com/stydejava/p/13388798.html