冒泡排序,快速排序

冒泡排序:
算法描述:

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤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);
      }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值