zoukankan      html  css  js  c++  java
  • 四种排序算法实现

    冒泡排序

    冒泡算法

    1. 比较相邻的元素。如果左边比右边大,就互换位置
    2. 对每一对相邻元素作同样的工作,从第一对到最后一对,完成后,最后元素为最大值

    源代码(冒泡排序)

    //冒泡排序
    public static void bubbleSort(int[] slist) {
    //从头开始遍历
        for(int i = 0;i < slist.length-1; i++) {
            //一一对比
            for(int j = i+1;j < slist.length; j++) {
            //如果前面的数大于后边的数,冒泡往后排
            if(slist[i] > slist[j]) {
                //交换两个值
                    int temp = slist[i];
                    slist[i] = slist[j];
                    slist[j] = temp;
                }
            }
    //System.out.println(Arrays.toString(slist));
        }
    }
    

    选择排序

    选择算法

    1. 找到数组中最大或者最小的元素,将它和数组的第一个元素交换位置
    2. 剩下的元素中,最小值与第二个元素交换位置

    源代码(选择排序)

    //选择排序
    public static void selectionSort(int[] slist) {
    
        //利用循环进行遍历
        for(int i = 0;i < slist.length;i++ ) {
            //假设第一个值为最小值
            int min = i;
            //遍历获取最小值位置
            for(int j = i; j < slist.length;j++) {
                if(slist[min] > slist[j]) {
                    min = j;
                }
            }
            //将该位置与小值交换
            int temp = slist[i];
            slist[i] = slist[min];
            slist[min] = temp;
        }
    }
    

    插入排序

    插入算法

    1. 从第一个元素开始,将此元素视为已排序
    2. 取下一元素,在已经排序的序列中从后向前扫描
    3. 如果已排序序列元素大于待插入元素,将序列元素后移
    4. 重复步骤3,直到找到适合位置
    5. 将新元素插入到该位置后
    6. 重复2~5

    源代码(插入排序)

    //插入排序
    public static void insertSort(int[] slist) {
        //将list[i]插入到list[0]...list[i-1]中
        for(int i = 1; i < slist.length;i++) {
            int temp = slist[i];
            int j = i-1;
            //将值往后移动
            for(;j >= 0 && slist[j] > temp;j--) {
                slist[j+1] = slist[j];
            }
            //在适当位置插入该值
            slist[j+1] = temp;
        }
    }
    

    快速排序

    快速排序算法

    1. 从序列中挑出一个元素作为“基准”(一般采用中间元素)
    2. 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。
    3. 递归地把小于基准值元素的子序列和大于基准值元素的子序列排序。

    源代码(快速排序)

    public static void quickSort(int[] slist,int head, int tail) {
        //如果该段一第一个下标值等于最后一个下标值,序列为空,序列长度小于等于1,结束
        if(head >= tail || slist == null || slist.length <= 1) {
            return ;
        }
        //head,tail值递归时仍需使用,因此定义i&j,取mid为基准
        int i = head,j = tail, mid = slist[(head+tail)/2];
        //因为i值会慢慢和j值接近,所以当i小于或等于j时保持循环,对比基准两边的值,将大于基准值的移到基准右边,将小于基准值的移到基准值左边
        while(i < j) {
            //在序列左边寻找大于基准的值
            while(slist[i] < mid && i < j) { ++i; }
            //在序列右边寻找小于基准的值
            while(slist[j] > mid && i < j) { --j; }
            //如果i等于j,退出当前循环
            if(i == j) { break; }
            //交换两个位置的值
            int temp = slist[i];
            slist[i] = slist[j];
            slist[j] = temp;
        }
        // 左边子序列递归
        quickSort(slist, head, i-1);
        //右边子序列递归
        quickSort(slist, i+1 , tail);
    }
    

    总结

    名称 稳定性 时间复杂度 空间复杂度
    冒泡排序 稳定 O(n^2) O(1)
    选择排序 不稳定 O(n^2) O(1)
    插入排序 稳定 O(n^2) O(1)
    快速排序 不稳定 O(n log n)(最坏O(n^2)) O(log n)

    References

    插入排序

    排序算法

  • 相关阅读:
    day18:正则表达式和re模块
    finance1:专业词汇
    Iterator & Iterable 和 Comparable&Comparator
    pandas中三种索引方式(.loc.iloc.ix)
    XML序列化与反序列化
    控件蓝图里控件绑定问题
    Mouse Properties(鼠标属性)
    cSV
    从父控件移除控件
    是否显示鼠标指针
  • 原文地址:https://www.cnblogs.com/glasses/p/10549643.html
Copyright © 2011-2022 走看看