JAVA的六种排序方法

冒泡 

public String[]bubble_sort(String[]arr) {

      //外层循环控制循环次数

      for (inti = 0; i < arr.length; i++) {

         //内层循环控制需要比较的次数

         for (intj = 0; j < arr.length - 1 - i; j++) {

            // 字符串比较用compareTo方法,大的向后排

            if (arr[j].compareTo(arr[j + 1]) > 0){

                String temp = arr[j];

                arr[j] =arr[j + 1];

                arr[j + 1] =temp;

            }

         }

      }

      return arr;

}

选择

public String[]select_sort(String[]arr) {

      for (inti = 0; i < arr.length - 1; i++) {

         for (intj = i + 1; j < arr.length;j++) {

            if (arr[i].compareTo(arr[j]) > 0) {                              String temp = arr[i];

                arr[i] =arr[j];

                arr[j] =temp;

            }

         }

      }

      return arr;

}

插入

public String[]insert_sort(String[]arr) {

      //从第二个位置,即下标为1的元素开始向前插入

      for (inti = 1; i < arr.length; i++) {

      // 插入排序从第i个元素开始向前比较,如果小于前一个元素,交换位置

         for (intj = i; j > 0; j--) {

            if (arr[j].compareTo(arr[j - 1]) < 0){

                String temp = arr[j];

                arr[j] =arr[j - 1];

                arr[j - 1] =temp;

            } else {

                break;

            }

         }

      }

      return arr;

   }

希尔

public String[]shell_sort(String[]arr) {

      int len = arr.length;

      // 初始步长 gap = n / 2

      for (intgap = len / 2;gap > 0; gap /= 2) {

         // 按步长进行插入排序

         for (inti = gap; i < len; i++) {

            // 插入排序

            for (intj = i; j >= gap; j -=gap) {

                if (arr[j].compareTo(arr[j -gap]) < 0) {

                   String temp =arr[j];

                   arr[j] =arr[j - gap];

                   arr[j -gap] = temp;

                } else {

                   break;

                }

            }

         }

      }

      return arr;

   }

快速

public String[]quick_sort(String[]arr) {

      //将所需参数传递给对应方法

      return quick_sort(arr, 0,arr.length - 1);

}

 

public String[]quick_sort(String[]arr, intstart, intend) {

      //跳出递归的条件

      if (start >=end) {

         returnarr;

      }

      //将第一个值作为中间值小的排序在左,大的排序在右

      String mid = arr[start];

      //定义双向的游标

      int low = start;

      int high = end;

      //控制游标向中间汇聚

      while (low <high) {

         //当右边的值比中间值大,游标左移

         while (low <high && arr[high].compareTo(mid) >= 0) {

            high -= 1;

         }

         //当右边的值比中间值小,将小的值移动到中间值左边

         arr[low] =arr[high];

         //当左边的值比中间值小,游标右移

         while (low <high && arr[low].compareTo(mid) < 0) {

            low += 1;

         }

         //当左边的值比中间值大,将大的数值移动到中间值右边

         arr[high] =arr[low];

      }

      //游标汇聚中间点,将此时low游标处的存储中间值,此时中间值左边一定小,右边一定为大值

      arr[low] = mid;

      //将中间值左侧数组递归调用

      quick_sort(arr, start, low - 1);

      //将中间值右侧数组递归调用

      quick_sort(arr, low + 1, end);

      //将排序后的结果返回

      return arr;

}

混合

static Listmerge_sort(Listlist) {

      // 判断集合大小

      if (list.size() <=1) {

         returnlist;

      }

      // 进行二分分解直至拆解为单个集合

      int num = list.size() / 2;

      // 递归调用拆解为单个

      List left = merge_sort(list.subList(0,num));

      List right = merge_sort(list.subList(num,list.size()));

      // 合并并排序

      return merge_sort(left, right);

}

 

   /**合并操作,将两个有序数组left[]right[]合并成一个大的有序数组*/

static Listmerge_sort(Listleft, List right) {

      //初始化两个集合的索引

      int l = 0;

      int r = 0;

      //创建一个空集合用来存储排序后的结果

      List result = new ArrayList();

      //判断索引如果小于两边集合就进入循环进行排序

      while (l <left.size()&& r <right.size()) {

         //获取对应索引的元素

         String m_left = (String)left.get(l);

         String m_right = (String)right.get(r);

         //将取出的元素进行比较,小的添加到结果集合当中并移动索引

         if (m_left.compareTo(m_right)<0) {

            result.add(m_left);

            l += 1;

         } else {

            result.add(m_right);

            r += 1;

         }

      }

      //将两个集合中的未添加的元素全部添加到结果集当中

      result.addAll(left.subList(l,left.size()));

      result.addAll(right.subList(r,right.size()));

      return result;

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值