冒泡排序,快速排序

冒泡排序:
算法描述:

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。
    在这里插入图片描述
    如果两个元素相等,不会再交换位置,所以冒泡排序是一种稳定排序算法。
public class T001 {
//    被排序的数组 arr
    public static void asort(int[] arr){
        for(int i =1;i<arr.length;i++){  //第i次排序  
            for(int j=0;j<arr.length-1;j++){//从索引为j的数开始 
                if (arr[j]>arr[j+1]){//相邻元素两两对比
                    int max = arr[j];// 元素交换  
                    arr[j] =arr[j+1];
                    arr[j+1]=max;
                }
            }
        }
    }
    public static void main(String[] args) {
        int[] arr = {5,8,-3,15,-6,2,4,12,7};
        System.out.println("原先数组:"+Arrays.toString(arr));
        asort(arr);
        System.out.println("冒泡数组:"+Arrays.toString(arr));
    }
}

快速排序:
算法描述:
使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
  • 在这里插入图片描述key值的选取可以有多种形式,例如中间数或者随机数,分别会对算法的复杂度产生不同的影响。

public class T002 {
    public static void main(String[] args) {
        int[] data={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};

        System.out.println("排序之前:\n"+java.util.Arrays.toString(data));
        quickSort(data,0,data.length-1);
       System.out.println("排序之后:\n"+java.util.Arrays.toString(data));
    }

    private static void quickSort(int[] data, int low, int hight) {
        int i,j,temp,t;
        if(low>hight){
            return;
        }
        i=low;
        j=hight;
        //temp就是基准位 
        temp=data[low];
        System.out.println("基准位:"+temp);
        while(i<j){
          //先看右边,依次往左递减  
          while(temp<=data[j]&&i<j){
          j--;
          }
          //再看左边,依次往右递增  
          while(temp>=data[i]&&i<j){
              i++;
          }
          //如果满足条件则交换  
          if(i<j){
          System.out.println("交换:"+data[i]+"和"+data[j]);
          t=data[j];
          data[j]=data[i];
         data[i]=t;
         System.out.println(java.util.Arrays.toString(data));

         }
        }
      //最后将基准位与i和j相等位置的数字交换  
     System.out.println("基准位"+temp+"和i、j相遇的位置"+data[i]+"交换");
      data[low]=data[i];
      data[i]=temp;
      System.out.println(java.util.Arrays.toString(data));

      //递归调用左半数组  
      quickSort(data,low,j-1);
      //递归调用右半数组  
      quickSort(data,j+1,hight);
      }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
冒泡排序快速排序都是常见的排序算法,它们各自有不同的优缺点。 冒泡排序的基本思想是通过相邻元素比较和交换来将较大的元素逐渐“冒泡”到数组的末尾。具体步骤如下: 1. 从数组第一个元素开始,依次比较相邻个元素,如果前一个元素大于后一个元素,则交换它们的位置。 2. 继续比较下一对相邻元素,重复上述操作,直到最后一对元素。 3. 重复以上步骤,每次比较元素个数减少一,直到所有元素都排好序。 冒泡排序的优点是实现简单,代码易于理解和实现。然而,冒泡排序的缺点是效率较低,特别是在处理大规模数据时,时间复杂度为O(n^2),性能较差。 快速排序是一种分治法的排序算法,它通过选择一个基准元素数组分成个子数组,然后递归地对子数组进行排序。具体步骤如下: 1. 选择一个基准元素(通常选择第一个或最后一个元素)。 2. 将数组分成个子数组,小于基准元素的放在左边,大于基准元素的放在右边。 3. 递归地对左右子数组进行快速排序。 4. 合并左右子数组和基准元素快速排序的优点是在平均情况下具有较高的效率,时间复杂度为O(nlogn)。它也是一种原地排序算法,不需要额外的空间。然而,快速排序的缺点是在最坏情况下(如已经有序的数组),时间复杂度可能达到O(n^2),性能下降。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值