排序算法---快速排序

思想是分治法。将数组分成2个子序列,然后独立的进行排序,和归并排序是互补的。

详细描述:首先在要排序的序列 a 中选取一个基准值,而后将序列分成两个部分,其中左边的部分 b 中的元素均小于或者等于基准值,右边的部分 c 的元素 均大于或者等于基准值,而后通过递归调用快速排序的过程分别对两个部分进行排序,最后将两部分产生的结果合并即可得到最后的排序序列。

快速排序在进行交换时,只是根据比较基数值判断是否交换,且不是相邻元素来交换,在交换过程中可能改变相同元素的顺序,因此是一种不稳定的排序算法。快速排序方法在要排序的数据已经有序的情况下最不利于发挥其长处。

复杂度:
当基数值不能很好地分割数组,即基准值将数组分成一个子数组中有一个记录,而另一个子组组有 n -1 个记录时,下一次的子数组只比原来数组小 1,这是快速排序的最差的情况。如果这种情况发生在每次划分过程中,那么快速排序就退化成了冒泡排序,其时间复杂度为O(n2)。
如果基准值都能讲数组分成相等的两部分,则出现快速排序的最佳情况。在这种情况下,我们还要对每个大小约为 n/2 的两个子数组进行排序。在一个大小为 n 的记录中确定一个记录的位置所需要的时间为O(n)。
快速排序的平均时间复杂性为O(nlogn)。

java实现:

public class fastSortTest {
    static void quick_sort(int s[], int l, int r)  
    {  
        if (l < r)  
        {  
            int i = l, j = r, x = s[l];  //x是基准

            while (i < j)  
            {  
                while(i < j && s[j] >= x) // 从右向左找第一个小于x的数  
                    j--;    
                if(i < j)   
                    s[i++] = s[j];  

                while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数  
                    i++;    
                if(i < j)   
                    s[j--] = s[i];  
            }

            s[i] = x; 
            quick_sort(s, l, i - 1); // 递归调用,排左侧的部分   
            quick_sort(s, i + 1, r); // 递归调用 ,排右侧的部分  
        }
    }  


    public static void main(String [] args) {
        int [] array={1,3,2,2,5,4};
        quick_sort(array,0,array.length-1);

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值