三个简单、基本的排序算法---插入排序、选择排序、冒泡排序

1.插入排序算法
插入排序的基本思想是在遍历数组的过程中,假设在序号 i (i>=1)之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过程中逐个将比较过的元素往后移一位,为元素 x “腾位置”,最后将 k 对应的元素值赋为 x ,一般情况下,插入排序的时间复杂度和空间复杂度分别为O(n2) 和 O(1)。(通俗说法:把数组后面那些没排序的元素换到数组前面已经排好序的部分里对应的位置)
例如:45 80 48 40 22 78
第一轮:45 80 48 40 22 78 ---> 45 80 48 40 22 78 i=1
第二轮:45 80 48 40 22 78 ---> 45 48 80 40 22 78 i=2
第三轮:45 48 80 40 22 78 ---> 40 45 48 80 22 78 i=3
第四轮:40 45 48 80 22 78 ---> 22 40 45 48 80 78 i=4
第五轮:22 40 45 48 80 78 ---> 22 40 45 48 78 80 i=5
(红色代表此轮要插入的元素,红色左边是已经排好序的,右边是待排序的)

/**
* @param int[] 未排序数组
* @return int[] 排完序数组
*/

public static int[] InsertSort(int[] array){
    for(int i =1;i<array.length;i++){
        int temp = array[i];
        int j = i-1;
        while(j>=0 && temp < array[j] ){
            array[j+1] = array[j];
            j--;
        }
        array[j+1] = temp;
    }
    return array;
}

2.选择排序算法
选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i+1,…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值/最小值的子流程,所以人们形象地称之为选择排序。选择排序的时间复杂度和空间复杂度分别为O(n2)和O(1)。(通俗说法:每次把剩余数组里最小的选出来放在数组的前面。所以第一次选出来的就是数组里面最小的,第二次选出来的就是数组里面第二小的,依次。。。。。)
例如:45 80 48 40 22 78
第一轮:45 80 48 40 22 78 ---> 22 80 48 40 45 78 i=0
第二轮:22 80 48 40 45 78 ---> 22 40 48 80 45 78 i=1
第三轮:22 40 48 80 45 78 ---> 22 40 45 80 48 78 i=2
第四轮:22 40 45 80 48 78 ---> 22 40 45 48 80 78 i=3
第五轮:22 40 45 48 80 78 ---> 22 40 45 48 78 80 i=4
(红色代表此轮需要排序的序号的元素,红色左边是已经排好序的,右边是待排序的)

/**
* @param int[] 未排序数组
* @return int[] 排完序数组
*/

public int[] sortSelect(int[] arr){
    for (int i = 0; i < arr.length-1; i++) {
        int miniPost = i;
        for (int m = i + 1; m < arr.length; m++) {
            if (arr[m] < arr[miniPost])
           miniPost = m;
        }
        if (arr[i] > arr[miniPost]) {
            int temp = arr[i];
            arr[i] = arr[miniPost];
            arr[miniPost] = temp;
        }
    }
    return arr;
}
                        

3.冒泡排序算法

冒泡排序的基本思想是將比較大的數字沉在最下面,较小的浮在上面。

冒泡排序的时间复杂度和空间复杂度分别是O(n^2)和O(1)。

/**
* @param int[] 未排序数组
* @return int[] 排完序数组
*/

public int[] sortBubble(int[] array){
  int temp;
  // 第一层循环:表明比较的次数, 比如 length 个元素,比较次数为 length-1 次(肯定不需和自己比)
  for(int i=0;i<array.length-1;i++){
    for (int j = array.length - 1; j > i; j--) {
      if (array[j] < array[j - 1]) {
        temp = array[j];
        array[j] = array[j - 1];
        array[j - 1] = temp;
      }
    }
  }
  return array;
}

 

posted on 2016-10-30 16:55  毛先森  阅读(14863)  评论(0编辑  收藏  举报

导航