程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JAVA中的常見8種排序算法

JAVA中的常見8種排序算法

編輯:關於JAVA
分類:
1)插入排序(直接插入排序、希爾排序)
2)交換排序(冒泡排序、快速排序)
3)選擇排序(直接選擇排序、堆排序)
4)歸並排序
5)分配排序(基數排序)

所需輔助空間最多:歸並排序
所需輔助空間最少:堆排序
平均速度最快:快速排序

不穩定:快速排序,希爾排序,堆排序。
1)插入排序
/**
 * 直接插入排序,性能比冒泡和簡單選擇排序好
 * 算法復雜度O(n*n)
 * @param data
 */
public static void insertSort(int[] data) {
    int temp = 0;
    for (int i = 1; i < data.length; i++) {
        int j = i - 1;
        temp = data[i];
        for (; j >= 0 && temp < data[j]; j--) {
            data[j + 1] = data[j];  //將大於temp的值整體後移一個單位
        }
        data[j + 1] = temp;

    }
}
/**
 * 希爾排序,是選取一個增量,對整個數組分組,然後對每個小部分使其有序,
 * 最後對整個部分使其有序,時間復雜度是On^3/2,是一種不穩定排序
 * @param data
 */
public static void shellSort(int[] data) {
    double d1 = data.length;
    int temp = 0;
    while (true) {
        d1 = Math.ceil(d1 / 2);
        int d = (int) d1;
        for (int x = 0; x < d; x++) {
            for (int i = x + d; i < data.length; i += d) {
                int j = i - d;
                temp = data[i];
                for (; j >= 0 && temp < data[j]; j -= d) {
                    data[j + d] = data[j];
                }
                data[j + d] = temp;
            }
        }
        if (d == 1) {
            break;
        }
    }
}

2)交換排序
/**
 * 冒泡排序從下到大優化了的冒泡排序
 * 冒泡排序的時間復雜度是O(n*n)
 * @param data
 * @return
 */
public static int[] sort(int[] data) {
    int temp;
    boolean flag = false;
    for (int i = 0; i < data.length - 1; i++) {
        flag = true;
        for (int j = 0; j < data.length - i - 1; j++) {
            if (data[j] > data[j + 1]) {
                temp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = temp;
                flag = false;
            }
        }
        //如果有一次內層循環沒有交換排序,則說明數組已經有序了,直接退出,不用進行下一輪冒泡循環,提高效率
        if (flag) {
            break; //可以注釋這一行,單步測試或者查看i的值即可驗證
        }
        System.out.println(i);
    }
    return data;
}

/**
 * 快速排序,
 * 選擇一個基准元素,通常選擇第一個元素或者最後一個元素,通過一趟掃描,
 * 將待排序列分成兩部分,一部分比基准元素小,一部分大於等於基准元素,
 * 此時基准元素在其排好序後的正確位置,然後再用同樣的方法遞歸地排序劃分的兩部分。
 * @param data
 */
public static void quickSort(int[] data) {
    quick(data);
}

private static int getMiddle(int[] list, int low, int high) {
    int tmp = list[low];    //數組的第一個作為中軸
    while (low < high) {
        while (low < high && list[high] >= tmp) {
            high--;
        }
        list[low] = list[high];   //比中軸小的記錄移到低端
        while (low < high && list[low] <= tmp) {
            low++;
        }
        list[high] = list[low];   //比中軸大的記錄移到高端
    }
    list[low] = tmp;              //中軸記錄到尾
    return low;                   //返回中軸的位置
}

private static void _quickSort(int[] list, int low, int high) {
    if (low < high) {
        int middle = getMiddle(list, low, high);  //list數組進行一分為二
        _quickSort(list, low, middle - 1);       //對低字表進行遞歸排序
        _quickSort(list, middle + 1, high);       //對高字表進行遞歸排序
    }
}

private static  void quick(int[] a2) {
    if (a2.length > 0) {    //查看數組是否為空
        _quickSort(a2, 0, a2.length - 1);
    }
}
*
  • 共3頁:
  • 上一頁
  • 1
  • 2
  • 3
  • 下一頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved