排序算法

排序算法

1.直接插入排序
(1)將第i個(gè)元素插入到前面的有序數(shù)列中范咨,即從第i-1個(gè)元素開(kāi)始向前遍歷故觅,如果遍歷到的元素大于第i個(gè)元素,則該元素向后移動(dòng)一個(gè)位置渠啊,直至找到一個(gè)不大于第i個(gè)元素的元素或遍歷到arr[0]處输吏,插入第i個(gè)元素。

    public static void insertion_sort1(int arr[]) {
        int i, j;
        for (i = 1; i < arr.length; i++) {
            // 獲取第i個(gè)元素
            int key = arr[i];
            for (j = i - 1; j >= 0; j--) {
                // 從第i-1個(gè)元素開(kāi)始向前遍歷
                if (arr[j] > key)
                    arr[j + 1] = arr[j];
                else {
                    break;
                }
            }
            // 找到合適位置替蛉,插入第i個(gè)元素
            arr[j + 1] = key;
        }
    }

(2)將第0個(gè)位置當(dāng)作監(jiān)視哨贯溅,不存放元素

    public static void insertion_sort2(int arr[]) {
        int i, j;
        for (i = 2; i < arr.length; i++) {
            arr[0] = arr[i];
            for (j = i - 1; arr[j] > arr[0]; j--) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = arr[0];
        }
    }

2.冒泡排序

    public static void bubble_sort(int arr[]) {
        int temp, flag;
        for (int i = 0; i < arr.length - 1; i++) {// i表示第幾次冒泡
            flag = 0;
            for (int j = 0; j < arr.length - 1 - i; j++) {// 控制每次冒泡的比較次數(shù)
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = 1;
                }
            }
                        // 如果一次冒泡沒(méi)有交換元素炼杖,說(shuō)明排序完成
            if (flag == 0)
                break;
        }
    }

3.簡(jiǎn)單選擇排序

    public static void simple_selection_sort(int arr[]) {
        int temp, position;
        // 為第i個(gè)位置尋找對(duì)應(yīng)的元素
        for (int i = 0; i < arr.length - 1; i++) {
            position = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[position] > arr[j]) {
                    position = j;
                }
            }
            if (position != i) {
                temp = arr[i];
                arr[i] = arr[position];
                arr[position] = temp;
            }
        }
    }

4.希爾排序
將原序列拆分成多個(gè)子序列,分別對(duì)子序列進(jìn)行直接插入排序盗迟。初始增量為序列長(zhǎng)度的一半,增量最后為1熙含。

    public static void shell_sort(int arr[]) {
        // 初始增量
        int increment = arr.length / 2;
        int i, j;
        while (increment >= 1) {
            // 進(jìn)行插入排序
            for (i = increment; i < arr.length; i++) {
                int key = arr[i];
                for (j = i - increment; j >= 0; j = j - increment) {
                    if (arr[j] > key)
                        arr[j + increment] = arr[j];
                    else
                        break;
                }
                arr[j + increment] = key;
            }
            // 下一輪的增量
            increment = increment / 2;
        }
    }

5.堆排序

    public static void heap_sort(int[] arr) {
                // 建最大堆罚缕,依次調(diào)整非葉子結(jié)點(diǎn)的位置
        for (int pos = (arr.length / 2) - 1; pos >= 0; pos--) {
            Sift(arr, pos, arr.length - 1);
        }
        for (int i = 0; i < arr.length - 1; i++) {
            // 互換堆頂元素和當(dāng)前最后一個(gè)葉子結(jié)點(diǎn)
            int temp = arr[0];
            arr[0] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = temp;
            // 調(diào)整堆頂元素的位置,堆的大小減1
            Sift(arr, 0, arr.length - 2 - i);
        }
    }

        // 數(shù)組中第0-high個(gè)元素組成最大堆怎静,調(diào)整第i個(gè)位置上元素的位置
    private static void Sift(int[] arr, int i, int high) {
        int temp = arr[i];
        int j = (2 * i) + 1;// 獲取第i個(gè)位置上對(duì)應(yīng)的左結(jié)點(diǎn)
        while (j <= high) {
            // 如果有右結(jié)點(diǎn)且右結(jié)點(diǎn)大于左結(jié)點(diǎn)邮弹,獲取第i個(gè)位置上對(duì)應(yīng)的右結(jié)點(diǎn)
            if (j < high && arr[j] < arr[j + 1])
                j++;
            if (temp < arr[j]) {
                arr[i] = arr[j];
                i = j;
                j = (2 * i) + 1;
            } else {
                break;
            }
        }
        arr[i] = temp;
    }

6.歸并排序

    private static void merge_sort(int[] arr, int left, int right) {
        if (left < right) {
            int center = (left + right) / 2;
            merge_sort(arr, left, center); // 左側(cè)進(jìn)行歸并排序
            merge_sort(arr, center + 1, right); // 右側(cè)進(jìn)行歸并排序
            merge(arr, left, center + 1, right); // 合并兩個(gè)有序序列
        }
    }

    // 將兩個(gè)有序序列合并為一個(gè)有序序列
    private static void merge(int[] arr, int leftPos, int rightPos, int rightEnd) {
        int temp[] = new int[arr.length];
        int leftEnd = rightPos - 1; // 左側(cè)結(jié)束下標(biāo)
        int tempPos = leftPos; // 記錄temp數(shù)組的下標(biāo)
        int left = leftPos; // 記錄arr數(shù)組的左側(cè)開(kāi)始下標(biāo),最后復(fù)制時(shí)需要使用

        while (leftPos <= leftEnd && rightPos <= rightEnd) {
            if (arr[leftPos] <= arr[rightPos]) {
                temp[tempPos] = arr[leftPos];
                tempPos++;
                leftPos++;
            } else {
                temp[tempPos] = arr[rightPos];
                tempPos++;
                rightPos++;
            }
        }
        while (leftPos <= leftEnd) {// 如果左側(cè)還有元素
            temp[tempPos] = arr[leftPos];
            tempPos++;
            leftPos++;
        }
        while (rightPos <= rightEnd) {// 如果右側(cè)還有元素
            temp[tempPos] = arr[rightPos];
            tempPos++;
            rightPos++;
        }
        // 將temp數(shù)組中的元素復(fù)制到arr數(shù)組中
        for (int i = left; i <= rightEnd; i++) {
            arr[i] = temp[i];
        }
    }

7.快速排序

    public static void quick_sort(int arr[], int left, int right) {
        int m = left, n = right;
        if (left < right) {
            int temp = arr[left];
            // 下面的循環(huán)完成了一趟排序蚓聘,將數(shù)組中小于temp的元素放在左邊腌乡,大于temp的元素放在右邊
            while (m != n) {
                while (n > m && arr[n] > temp)// 從右往左掃描,找到一個(gè)小于temp的元素
                    n--;
                if (n > m) {// 跳出上方while循環(huán)夜牡,如果n和m不相等与纽,移動(dòng)元素;如果n和m相等塘装,跳出整個(gè)循環(huán)
                    arr[m] = arr[n];
                    m++;
                }
                while (m < n && arr[m] < temp)// 從左往右掃描急迂,找到一個(gè)大于temp的元素
                    m++;
                if (m < n) {// 跳出上方while循環(huán),如果n和m不相等蹦肴,移動(dòng)元素僚碎;如果n和m相等,跳出整個(gè)循環(huán)
                    arr[n] = arr[m];
                    n--;
                }
            }
            arr[m] = temp;// 將temp放到合適的位置上
            quick_sort(arr, left, m - 1);
            quick_sort(arr, m + 1, right);
        }
    }

8.基數(shù)排序(桶排序)
從最低位開(kāi)始阴幌,將各個(gè)數(shù)字存儲(chǔ)到對(duì)應(yīng)的桶中勺阐。然后將桶中的元素按照桶的編號(hào)從小到大取出;對(duì)于同一個(gè)桶中的元素矛双,先放入的先取出渊抽,后放入的后取出(保證穩(wěn)定性)。然后循環(huán)進(jìn)行下一位排序议忽,直至最高位排序完成腰吟。

public class RadixSort {

    public static void main(String[] args) {
        int arr[] = new int[] { 73, 122, 93, 43, 555, 14, 828, 65, 39, 81 };
        radix_Sort(arr, 1000);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ",");
        }
    }

    private static void radix_Sort(int[] arr, int d) {
        int n = 1;
        // 計(jì)數(shù)器
        int count;
        // 排序桶。10代表0-9這10個(gè)數(shù)字徙瓶,arr.length代表一個(gè)桶中最多含有的數(shù)字個(gè)數(shù)
        int[][] bucket = new int[10][arr.length];
        // 每個(gè)桶的計(jì)數(shù)器毛雇,記錄桶中有多少數(shù)字
        int[] order = new int[arr.length];

        while (n < d) {
            // 將arr數(shù)組中的數(shù)字放入對(duì)應(yīng)的桶中
            for (int i = 0; i < arr.length; i++) {
                int temp = (arr[i] / n) % 10;// 個(gè)位、十位...的數(shù)據(jù)
                bucket[temp][order[temp]] = arr[i];
                order[temp]++;
            }
            count = 0;
            for (int i = 0; i < arr.length; i++) {
                if (order[i] != 0)// 如果這個(gè)桶中有數(shù)據(jù)侦镇,將這個(gè)桶中的所有數(shù)據(jù)保存到原數(shù)組中
                {
                    for (int j = 0; j < order[i]; j++) {
                        arr[count] = bucket[i][j];
                        count++;
                    }
                    // 將桶的計(jì)數(shù)器歸0灵疮,用于下一位排序
                    order[i] = 0;
                }
            }
            n *= 10;
        }
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市壳繁,隨后出現(xiàn)的幾起案子震捣,更是在濱河造成了極大的恐慌荔棉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒿赢,死亡現(xiàn)場(chǎng)離奇詭異润樱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)羡棵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)壹若,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人皂冰,你說(shuō)我怎么就攤上這事店展。” “怎么了秃流?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵赂蕴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我舶胀,道長(zhǎng)概说,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任嚣伐,我火速辦了婚禮席怪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纤控。我一直安慰自己挂捻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布船万。 她就那樣靜靜地躺著刻撒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耿导。 梳的紋絲不亂的頭發(fā)上声怔,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音舱呻,去河邊找鬼醋火。 笑死,一個(gè)胖子當(dāng)著我的面吹牛箱吕,可吹牛的內(nèi)容都是我干的芥驳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼茬高,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼兆旬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起怎栽,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丽猬,失蹤者是張志新(化名)和其女友劉穎宿饱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體脚祟,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谬以,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了由桌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片为黎。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沥寥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柠座,我是刑警寧澤邑雅,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站妈经,受9級(jí)特大地震影響淮野,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吹泡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一骤星、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爆哑,春花似錦洞难、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至潭袱,卻和暖如春柱嫌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屯换。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工编丘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彤悔。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓嘉抓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親晕窑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掌眠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容