冒泡排序、快速排序算法理解

本文介绍了冒泡排序和快速排序两种经典排序算法。冒泡排序通过不断交换相邻元素实现排序,而快速排序则利用分治策略,以基准数进行分区,再对分区后的子数组进行递归排序,平均效率优于冒泡排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、冒泡排序

    冒泡排序是各种教材中 经常提到的一种排序 方法,基本思想就是:

    ① 从数组的头部开始,比较相邻两个数,如果第1个数比第2个数大,就交换他们两个。也就是让较大

  的数逐渐往后 移动,直到数组的末尾,经过第一轮的比较,就可以找到最大的元素,并将它移动到最后一个位置。

   ② 第一轮结束后,继续第二轮,仍然从数组的头部开始比较,直到数组的倒数第2个元素为止,经过第2轮比较,就可以找到次大的元素,并将它放到倒数第二个位置。

   ③ 一次类推,经过n-1轮“冒泡”后,就可以将所有的元素都排列好。
 

二、快速排序

  快速排序是对冒泡排序的一种优化,平均效率较高,为什么说平均效率高呢?如果数组的元素大小是递减排列,那么快速排序法与冒泡法的效率是一样的,只有数组元素随机排列时,其平均效率才比较高。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法。(分治翻译的不太容易理解,应该是 分段)。

该方法的基本思想是:

① 先从数组中取出一个数作为基准数(一般取第一个数)。

② 分区过程:将比这个数大的数全部放到它的右边,小于或等于它的数,全放到它的左边。

③ 经过步骤②,我们取的那个基数就在整个数组的中间某个位置(不一定正中间),将整个数组分成了两段,左边是小于基数的一段,而右边是大于基数的一段。然后再分别对左右两段区间重复步骤②,直到各个区 间只有一个数。
 

public class QuickSort {  
  public static int Partition(int a[],int p,int r){  
  int x=a[r-1];  
  int i=p-1;  
  int temp;  
     for(int j=p;j<=r-1;j++){  
      if(a[j-1]<=x){  
       // swap(a[j-1],a[i-1]);  
       i++;  
       temp=a[j-1];  
       a[j-1]=a[i-1];  
       a[i-1]=temp;  
  }  
     }  
     //swap(a[r-1,a[i+1-1]);  
     temp=a[r-1];  
     a[r-1]=a[i+1-1];  
     a[i+1-1]=temp;  
     return i+1;  
  }  
 public static void QuickSort(int a[],int p,int r){  
  if(p<r){  
   int q=Partition(a,p,r);  
   QuickSort(a,p,q-1);  
   QuickSort(a,q+1,r);  
   }  
}  
public static void main(String[] args){  
  int a[]={23,53,77,36,84,76,93,13,45,23};  
  QuickSort(a,1,10);  
    for (int i=1;i<=10;i++)  
   System.out.println(a[i-1]);  
  } 
}  

快速排序算法的平均效率要高于冒泡排序算法,不过由于使用了递归的思路,所以对于数据量比较小的,还是使用冒泡排序算法,对于数据量比较大的,推荐使用快速排序算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值