快速排序的Java代码

1、快速排序,时间复杂度O(nlogn)

        算法的思路:为了叙述的方便,这里以实现升序排列为例。

               a)从待排序的数组A中,任意选择一个数,做为分界值,

              b)将小于等于这个分界值小的数,放到它的前面,记为数组B1;比分界值大的数,放到它的后面,记为数组B2,这样就确定了分界值应该在的位置,是B1的最后一个。

              c)分别对B1和B2重复a)b),直到数组长度为1,在对B1执行a)时,数组长度应该减去1,因为B1的最后一位的位置就是在这里,不需要再进行排序了。

             d)最后将排好序的B1和B2写到数组A中。由于是递归算法,只有在B1和B2已经排好序时在最终写入A。

       举例:待排序数组A=[ 3 5 2 7 6 9 4],1)选择最后一个数4,做为分界值。2)则B1=【3 2 4】,B2=【5 7 6 9】。3)对B1执行a)和b),即选择B1的倒数第二个数做为分界值,C1=【2】,C2=【3】。此时数组长度为1,可以写回上一步,也就是B1=C1+C2+B1的最后一位,即B1=【2 3 4】接下来排序B2,依次类推,返回到A。

package Algorithms;

import java.util.Scanner;

public class QuickSort {

 public static void main(String[] args) {

  System.out.println("input the number of array:");
  Scanner in = new Scanner(System.in);
  int k = in.nextInt();
     int[] array = new int[k];
  System.out.println("input array with "+k+" numbers:");    
  
  for(int i=0;i<k;i++){
   array[i] = in.nextInt();
  }
  
  AList AA = new AList(k,array);
  AA.printA();
  AA.SortA(AA.getnum());
  AA.printA();
 }

}
class AList{
 
 public AList(int k, int[] Tarray) {
  num = k;
  array = new int[num];
  for(int i=0;i<num;i++)
   array[i] = Tarray[i];
 }
 
 public void printA(){
  for(int i:array)
   System.out.printf("%4d",i);
  System.out.println();  
 }
 
 public void SortA(int k){
  if(k<=1){
   return;
  }
  int level = array[k-1];
  int numA1 = 0;
  int numA2 = 0;
  int[] A1 = new int[k];
  int[] A2 = new int[k];
  
  for(int i=0;i<k;i++){
   if(array[i]<=level){
    A1[numA1] = array[i];
    numA1++;
   }else{
    A2[numA2] = array[i];
    numA2++;
   }    
  }
  AList B1 = new AList(numA1,A1);
  AList B2 = new AList(numA2,A2);
  B1.SortA(numA1-1);
  B2.SortA(numA2);
  for(int i=0;i<numA1;i++)
   array[i]=B1.getEmp(i);
  for(int i=0;i<numA2;i++)
   array[numA1+i]=B2.getEmp(i);
  
 }
 public int getnum(){
  return num;
 }
 public int getEmp(int k){
  return array[k];
 }
 
 private int num;
 private int[] array;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值