基于Java语言的排序算法

image.png

各排序代码如下:

一:交换排序

// 冒泡排序
@Override
public void bubbleSort(int[] data) {
    if (null == data || data.length <= 1) {
        return;
    }
    final int length = data.length;
    int temp = 0;
    // 外层循环控制比较趟数 (每比较一趟,会确定一个数的最终位置, 会比较data.length - 1 趟)
    for (int i = 0; i < length - 1; i++) { // 注意下标  结尾是 length - 1
        // 内层循环是比较第[i]元素与,[i + 1, data.length]中所有元素的比较
        for (int j = 0; j < length - 1 - i; j++) {
            if (data[j + 1] < data[j]) {
                temp = data[j + 1];
                data[j + 1] = data[j];
                data[j] = temp;
            }
        }
    }
}

// 快速排序
@Override
public void quickSort(int[] data) {
    if (null == data || data.length <= 1) {
        return;
    }
    long startTime = System.currentTimeMillis();
    inner_quickSort(data, 0, data.length - 1);
    System.out.println("快速排序时间:" + (System.currentTimeMillis() - startTime));
}

private void inner_quickSort(int[] data, int start, int end) {
    if (start < end) {
        int i = partition(data, start, end);
        inner_quickSort(data, start, i - 1);
        inner_quickSort(data, i + 1, end);
    }
}

private int partition(int[] array, int start, int end) {
    int temp = array[start]; // 用子序的第一个作为基准
    int i = start, j = end;
    while (i < j) {
        // 先遍历右边的数据
        while (i < j && array[j] > temp) {
            j--;
        }
        if (i < j) {
            array[i] = array[j];
            i++;
        }

        // 再遍历左边的数据
        while (i < j && array[i] < temp) {
            i++;
        }
        if (i < j) {
            array[j] = array[i];
            j--;
        }
        // array[i] = temp;
    }
    array[i] = temp;
    return i;
}

二:选择排序

// 简单选择排序
@Override
public void simpleSelect(int[] data) {
    if (null == data || data.length <= 1) {
        return;
    }
    final int length = data.length;
    for (int i = 0; i < length; i++) {
        int target = i;
        for (int j = i + 1; j < length; j++) {
            if (data[j] < data[target]) {
                target = j;
            }
        }
        int temp = 0;
        if (target != i) {
            temp = data[target];
            data[target] = data[i];
            data[i] = temp;
        }
    }

}

// 堆排序
@Override
public void heapSort(int[] data) {
    // TODO Auto-generated method stub

}

三: 插入排序

// 直接插入排序
@Override
public void directInsertSort(int[] data) {
    for (int i = 1; i < data.length; i++) {
        inner(data, 1, i);
    }
}

// 希尔排序
@Override
public void shellSort(int[] data) {
    int length = data.length;
    for (int gap = length / 2; gap > 0; gap /= 2) {
        for(int j = gap; j < length; j++) {
            inner(data, gap, j);
        }
    }
}

private void inner(int[] data, int gap, int i) {
    int willInsert = data[i];
    int j;
    for (j = i; j >= gap && data[j - gap] > willInsert; j -= gap) {
        data[j] = data[j - gap];
    }
    data[j] = willInsert;
}

四: 归并排序

时间复杂度:O(nlogn)
空间复杂度:O(N) ,归并排序需要一个与原数组相同长度的数组来做辅助排序。
稳定性:是稳定的排序算法

@Override
public void mergeSort(int[] data) {
    if (null == data || 1 >= data.length) {
        return;
    }
    sort(data, 0, data.length - 1);
}

private void sort(int[] a, int start, int end) {
    if (start < end) {// 当子序列中只有一个元素时结束递归
        final int mid = (start + end) / 2;// 划分子序列
        // 对左侧子序列进行递归排序
        sort(a, start, mid);
        // 对右侧子序列进行递归排序
        sort(a, mid + 1, end);
        // 合并
        merge(a, start, mid, end);
    }
}

// 两路归并算法,两个排好序的子序列合并为一个子序列
private void merge(int[] a, int left, int mid, int right) {
    int[] tmp = new int[a.length];// 辅助数组
    int p1 = left, p2 = mid + 1, tmpIndex = left;// p1、p2是检测指针,k是存放指针
    
    // 比较左右两部分的元素,哪个小就把哪个元素填入tmp中
    while (p1 <= mid && p2 <= right) {
        tmp[tmpIndex++] = a[p1] <= a[p2] ? a[p1++] : a[p2++];
    }

    // 如果第一个序列未检测完,直接将后面所有元素加到合并的序列中
    // (以下两个while只有一个会执行)
    while (p1 <= mid)
        tmp[tmpIndex++] = a[p1++];

    while (p2 <= right)
        tmp[tmpIndex++] = a[p2++];

    // 把最终的排序的结果复制给原数组
    for (int i = left; i <= right; i++)
        a[i] = tmp[i];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容

  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,342评论 0 1
  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,430评论 1 4
  • 排序大的分类可以分为两种:内排序和外排序。在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外...
    文哥的学习日记阅读 998评论 2 10
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,183评论 0 52
  • 题目链接难度:中等 类型: 数组、深度优先搜索 班上有 N 名学生。其中有些人是朋友,有些则不...
    wzNote阅读 1,403评论 0 1