快速排序java实现

    快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序在笔试面试中也是高频考点。
    假设我们要对7,4,5,6,1,8,9,3,2这几个数进行排序,我们首先要找一个基准数,为了方便,我们取第一个数7当作基准数,我们要将这些数字中比7小的放在7的左边,比7大的放在7的右边。其实每一趟排序就是要将基准数放在合适的位置。我们先从右边(先从右边是因为基准数选在了最左边)找出第一个比7小的数,再从左边找出第一个比7大的数,交换它们的位置,继续从两头找,直到左右相遇在一个数,就将这个数与基准数交换,至此,一趟排序完成,7的左边全是比它小的,7的右边全是比它大的。然后分别将左边的序列和右边的序列进行递归快速排序。
      快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。

“`
public class quick_sort {

public static void main(String[] args) {
    System.out.println("请输入数组长度:");
    Scanner in=new Scanner(System.in);
     while(in.hasNext()){
         int m=in.nextInt(); 
         int[] arr=new int[m];
         System.out.println("请输入数组:");
         for(int i=0;i<m;i++){
             arr[i]=in.nextInt();
         }
    int len = arr.length;
    System.out.println("原数组为:");
    for(int i=0;i<len;i++){
        System.out.print(arr[i]+" ");
    }
    System.out.println();
    quicksort(arr,0,len-1);
    System.out.println("快速排序后的数组为:");
    for(int i=0;i<len;i++){
        System.out.print(arr[i]+" ");
    }
    }
}
public static void quicksort(int arr[],int left,int right) {
    int i,j,t,temp;
    if(left>right)
        return;
    temp = arr[left];   //temp中存基准数
    i = left;
    j = right;
    while(i!=j) {
        while(arr[j]>=temp&&i<j)
            j--;
        while(arr[i]<=temp&&i<j)
            i++;
        if(i<j) {
            t= arr[i];
            arr[i] = arr[j];
            arr[j] = t;
        }
    }
    arr[left] = arr[i];
    arr[i] = temp;

    quicksort(arr,left,i-1);
    quicksort(arr,i+1,right);
}

}

“`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值