欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

三种基本排序的实现及其效率对比:冒泡排序、选择排序和插入排序

程序员文章站 2022-06-24 11:13:44
java实现冒泡排序、选择排序和插入排序这三种基本排序,并对这三种基本排序的效率做对比。 ......

public class threetypesofbasesort {
  // ========================== 三种基本排序的效率对比 ============================
  public static void main(string[] args) {
    threetypesofbasesort sort = new threetypesofbasesort();

    // 测试百万级别的数组排序,看三种基本排序的的效率差别:
    int number = 500000;
    int[] array = new int[number];
    int[] array1 = new int[number];
    int[] array2 = new int[number];
    for(int i = 0; i < array.length; i++) {
      int temp = new random().nextint(number);
      array[i] = temp;
      array1[i] = temp;
      array2[i] = temp;
    }
    system.out.println("数组准备完毕~");

    long start1 = system.currenttimemillis();
    sort.bubblesort(array);
    long end1 = system.currenttimemillis();
    system.out.println("bubblesort 用时:" + (end1 - start1));//5万:4157。50万:430255。100万:1644079

    long start2 = system.currenttimemillis();
    sort.selectionsort(array1);
    long end2 = system.currenttimemillis();
    system.out.println("selectsort 用时:" + (end2 - start2));//5万:727。50万:74253。100万:281276 ==》选择排序比冒泡快了5.7倍。

    long start3 = system.currenttimemillis();
    sort.insertionsort(array2);
    long end3 = system.currenttimemillis();
    system.out.println("insertionsort 用时:" + (end3 - start3));//5万:827。50万:84644。 ==》插入排序比选择排序稍慢一点。
  }

  // ========================== bubblesort ============================
  /**
  * 冒泡排序:相邻的两个数进行比较,如果是从小到大排序,则将较大的那个数放后,每次都要交换。
  * 冒泡排序的优化思路:
  *    ① 判空;
  *    ② 元素的个数很特殊时:个数为0、1时;
  *    ③ 数组已经是有序的,或者是数组里所有元素都相同:
  */
  public void bubblesort(int[] target){
    if(target == null){
      return;
    }
    boolean tag = true;//如果数组是有序的,则不需要再进行交换。
    for(int i = 0; i < target.length -1 && tag; i++){//外层循环:控制比较的组数:(元素个数-1)次。
      tag = false;
      for(int j = 0; j < target.length - i - 1; j++){//内层循环:控制每组比较的次数:每组比较都从第一个元素开始比较,把每次比较时的max移到后面去,每组的比较次数=target.length-1-i。
        if(target[j] > target[j + 1]){
          int temp = target[j];
          target[j] = target[j + 1];
          target[j + 1] = temp;
          tag = true;
        }
      }
    }
  }

  // ======================= selectionsort ============================
  /**
  * 选择排序:
  *   第一趟从n个元素的数据序列中选出关键字最小/大的元素并放在最前位置,
  *   下一趟从n-1个元素中选出最小/大的元素并放在未排好序元素的最前位置。以此类推,经过n-1趟完成排序。
  */
  public void selectionsort(int[] target){
    if(target == null){
      return;
    }
    for(int i = 0; i < target.length - 1; i++){
      int tempindex = i;
      for(int j = i + 1; j < target.length; j++){
        if(target[tempindex] > target[j]){
          tempindex = j;
        }
      }
    int temp = target[tempindex];
    target[tempindex] = target[i];
    target[i] = temp;
    }
  }

  // ===================== insertsort ====================================
  /**
  * 插入排序:将一个数据插入到已经排好序的有序数据中(一般默认第一个元素是有序的,比较从第二个元素开始),
  * 从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。
  */
  public void insertionsort(int[] target){
    if(target == null){
      return;
    }
    //外层循环控制比较的组数;
    for(int i = 0; i < target.length - 1; i++){
      //两层循环:外层控制比较的组数;内层负责找出该组比较中,在已排好序数组之后的第一个无序的元素,并通过比较将这个无序元素插入到有序数组中。
      for(int j = i + 1; j > 0; j--){
        if(target[j - 1] > target[j]){
          int temp = target[j];
          target[j] = target[j - 1];
          target[j - 1] = temp;
        }else{
          break;
        }
      }
    }
  }
}