数据结构与算法(快排)

1?何为快排,

          快排遇到到思想也是分治思想,和归并排序是同意思想,单逻辑完全不同,

         快排的思想是这样的,如果要排序的数组下标是从p到r,那我们选择p到r之间的任意一个数据作为分区点(pivot),遍历分区点左边的数据和分区点右边的数据,将比分区点小的数据放在分区点的左边,大于分区点的数据放在分区点的右边,这样的数据就被分为了3部分,,

根据分治的思想,我们可以用递归代码实现快速排序的实现逻辑,

public class QuickSort{
    public static void main(String[] args) {
		int[] num = {3,45,78,64,52,11,64,55,99,11,18};
		quickSort(num,0,num.length-1);
}

public static void quickSort(int[] num,int left,int right){
    if(left==right) return;
    //取基准值provit
   int key = num[left];//左边元素为分区值
   int i = left;
   int j = right;
    while(i<j){
       while(num[j] >= key && i<j){//j向左移动,直到遇到比key小的值,
            j--;
       }
      while(num[i] <= key&& i<j){//i向由移动,知道找到比key大的值
       i++;
      }
   //i和j指向的元素进行交换
   if(i<j){
   int temp = num[i];
   int[j] = num[i];
   num[i] = num[j];

  }
   }
num[left]=num[i];
num[i] = key;
count ++;
quickSort(num,left,i-1);
quickSort(num,i+1,right);
}
}

总结:由于上图可知,数据需要进行分区和交换,根据实现代码的编写,此种实现方式是原地排序,

  比如进行排序6,8,7,5,6,3,5,9,第一次分区之后,2个6的原有的前后位置发生变化,所以快排不是稳定排序.

 通常情况下快排序的时间复杂度是nlogn,但是我们看一个极端的例子1,2,3,4,5,我们取最后一个数据最为分区点,每次分区,2个区间的数据都是不均等的,我们大约需要进行n次分区,在这种极端的情况下,快排的时间复杂度由nlogn变为n^2。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值