常用排序算法的Java实现

  • (冒泡排序)大学里面最早接触的一种排序

    • 基本原理

      * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。  
      * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。  
      * 针对所有的元素重复以上的步骤,除了最后一个。
      * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 
    • 代码实现

      public static void bubbleSort(int number[]) {
              for (int i = 0; i < number.length-1; i++)
                  for (int j = 0; j < number.length-i-1; j++) {
                      if(number[j]>number[j+1]){
                          int temp=number[j];
                          number[j]=number[j+1];
                          number[j+1]=temp;
                      }
              }
          }
  • 选择排序

    • 基本思想

      在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

      img

    • 代码实现

      public static void selectSort(int number[]){
              for(int i=0;i<number.length;i++){
                  int minIndex=i;            //标注最小值,初始为i
                  for(int j=i;j<number.length;j++){
                      if(number[j]<number[minIndex]){
                          minIndex=j;         //遍历i之后的数组,找到最小的数
                      }
                  }
                  int temp=number[i];
                  number[i]=number[minIndex];
                  number[minIndex]=temp;      //将i和最小的交换
              }
          }
  • 快速排序

    • 基本思想

      通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。

      img

      代码实现思路

      把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。
    • 代码实现(递归实现)

      public static void quickSort(int number[],int low,int high){
              if(low<high){
                  int middle=findMiddle(number,low,high);  //将low放在数组中间位置,low前面的比它小,low后面的比它大
                  quickSort(number, low, middle);  //分治再次进行快速排序
                  quickSort(number, middle+1, high);
              }
          }
      
          public static int findMiddle(int number[],int low,int high){
              int temp=number[low];    //将数组的low位置的数看做中轴
              while(low<high){
                  while(low<high&&number[high]>=temp){
                      high--;                         
       //从后往前数找到第一个比temp小的,这里一定要>=,不然如果数组中有相同的会出现stackOverFlow错误
                  }
                  number[low]=number[high]; //把那个大的数字放到low的位置上
                  while(low<high&&number[low]<=temp){
       //从前往后数找到第一个比temp大的,这里一定要<=,不然如果数组中有相同的会出现stackOverFlow错误
                      low++;
                  }
                  number[high]=number[low];  //把那个大的数字放到high的位置上
              }
              number[low]=temp;       //将中轴数放到low或者high上,此时low应等于high
              return low;
          }
  • 插入排序

    • 基本思想

    每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。

    img

    代码实现思路

    • 从第一个元素开始,该元素可以认为已经被排序
    • 取出下一个元素,在已经排序的元素序列中从后向前扫描
    • 如果该元素(已排序)大于新元素,将该元素移到下一位置
    • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
    • 将新元素插入到该位置中
    • 代码实现

      //插入排序
          public static void insertSort(int number[]){
              for(int i=0;i<number.length;i++){
                  int temp=number[i];
                  int j;
                  for(j=i;j>0&&number[j-1]>temp;j--){
                      number[j]=number[j-1];
                  }
                  number[j]=temp;
              }
          }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值