几种简单的排序算法--java实现

一,直接插入排序java

将前两个个数排序,构成一个有序数列,再将第三个数加入,将三个数进行排序,
构成一个有序数列,再将第四个数加入。。。。直到把第n个数加入,并进行排序
package SortingOrder;

import java.util.Arrays;

/**
 * 直接插入排序
 * 将前两个个数排序,构成一个有序数列,再将第三个数加入,将三个数进行排序,
 * 构成一个有序数列,再将第四个数加入。。。。直到把第n个数加入,并进行排序
 * 当n <= 50时,适合适用直接插入排序和简单选择排序,若是元素包含的内容过大,
 * 就不适合直接插入排序,由于直接插入排序须要移动元素的次数比较多.
 * 当数组基本有序的状况下适合使用直接插入排序和冒泡排序,它们在基本有序的状况下排序的时间复杂度接近O(n).
 */
public class StraightInsertSort {
    public static void main(String[] args) {

        int[] array = {25, 11, 45, 26, 12, 78};//要排序的数组
        int length = array.length;//把数组长度单独拿出来,提升效率

        for (int i = 1; i < length; i++) {
            int insertNum = array[i];//要插入的数
            int j;
            for (j = i - 1; j >= 0; j--) {
                if (array[j] > insertNum) {
                    array[j + 1] = array[j];//若前一个数大于后一个数,将其后移一位
                } else {
                    break;
                }
            }
            array[j + 1] = insertNum;
        }
        System.out.println(Arrays.toString(array));
    }
}


时间复杂度:O(n^2)

若是元素的个数过多,就不适合插入排序,由于插入排序移动的元素过多,当数组基本有序时,

适合使用直接插入排序和冒泡排序,基本有序时,排序的时间复杂度接近O(n)shell

二,希尔排序数组

直接插入排序的改进,希尔排序也成为“缩小增量排序”,其基本原理是,
现将待排序的数组元素分红多个子序列,
使得每一个子序列的元素个数相对较少,而后对各个子序列分别进行直接插入排序,
待整个待排序列“基本有序”后,最后在对全部元素进行一次直接插入排序。

package SortingOrder;

import java.util.Arrays;

/**
 * 希尔排序
 * 希尔排序也成为“缩小增量排序”,其基本原理是,现将待排序的数组元素分红多个子序列,
 * 使得每一个子序列的元素个数相对较少,而后对各个子序列分别进行直接插入排序,
 * 待整个待排序列“基本有序”后,最后在对全部元素进行一次直接插入排序。
 */

public class shellSortSmallToBig {
    public static void main(String[] args) {

        int[] array = {26, 53, 67, 48, 57, 13, 48, 32, 60, 50};
        test1(array);
    }

    public static void test1(int[] array) {
        System.out.println(Arrays.toString(array));
        int j;
        for (int step = array.length / 2; step > 0; step = step / 2) {
            System.out.println("step:" + step);
            for (int i = step; i < array.length; i++) {
                int temp = array[i];
                for (j = i - step; j >= 0; j = j - step) {
                    if (temp < array[j]) {
                        array[j + step] = array[j];
                    } else {
                        break;
                    }
                }
                array[j + step] = temp;
            }
            System.out.println(Arrays.toString(array));
        }
    }
}

时间复杂度O(n^2)spa

步长为5时:对a[0]和a[5],a[1]和a[6],a[2]和a[7],。。。进行排序code

步长为2时:a[0]和a[2],a[1]和a[3],a[2]和a[4],a[2]和a[0],。。。blog

。。。。排序

三,选择排序class

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;
而后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,
直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
package SortingOrder;

import java.util.Arrays;

/**
 * 选择排顺序
 * 第一次遍历:
 * 将数组中最小的移到最左边
 * 第二次遍历:
 * 将剩余中最小的移动到最左边
 * 。。。。。
 * 直到将全部数排序
 */
public class SelectSort {
    public static void main(String[] args) {
        int[] array={1,25,6,2,5,3,73,74,87,34};
        test1(array);
    }

    public static void test1(int[] array){
        int length = array.length;
        for(int i=0;i<length;i++){
            for(int j=i;j<length;j++){
                if(array[i]>array[j]){
                    int temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
            System.out.println(Arrays.toString(array));
        }
    }
}


四,冒泡排序test

将序列中全部元素两两比较,将最大的放在最后面。
将剩余序列中全部元素两两比较,将最大的放在最后面。
重复第二步,直到只剩下一个数
package SortingOrder;

import java.util.Arrays;

/**
 * 将序列中全部元素两两比较,将最大的放在最后面。
 * 将剩余序列中全部元素两两比较,将最大的放在最后面。
 * 重复第二步,直到只剩下一个数
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] array = {26, 53, 67, 48, 57, 13, 48, 32, 60, 50};
        test1(array);
    }

    public static void test1(int[] array) {

        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
            System.out.println("第" + (i+1) + "次排序:" + Arrays.toString(array));
        }
    }
}


时间复杂度O(n^2)效率