排序算法

排序算法

  • 冒泡排序
  • 插入排序
  • 快速排序
  • 选择排序
  • 希尔排序

1冒泡排序

1.1 原理

每轮循环 多次两两比较选出一个最大的排在最后面

排序算法

1.2 原码

/**
* Description TODO 冒泡排序
* Author Cloudr
* Date 2020/4/1 22:43
**/
public class BubbleSort {
    private static void bubbleSorts(int[] a) {

        int i, j, temp;

        for (i = 0; i < a.length - 1; i++) {       //每轮都是把最大的数排到最后 注意是 a.length-1 因为下文有一个j+1
            for (j = 0; j < a.length - 1 - i; j++) { //每次需要排的个数减少i个
                if (a[j] > a[j + 1]) {
                    temp = a[j + 1];
                    a[j + 1] = a[j];
                    a[j] = temp;
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] a = {1, 253, 56, 745, 342, 41, 654, 321432, 131, 324};
        bubbleSorts(a);
        for (int i : a) {
            System.out.println(i);
        }
    }
}

1.3 复杂度

* 时间复杂度



2直接插入排序

2.1 原理

直接插入排序是将未排序的数据插入至已排好序序列的合适位置。

具体流程如下:

1、首先比较数组的前两个数据,并排序;

2、比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置;

3、比较第四个元素与前三个排好序的数据,并将第四个元素放入适当的位置;

......

4、直至把最后一个元素放入适当的位置。

排序算法
排序算法

2.2 代码

public class insertSort {
    private static void insertSort(int[] a) {
        int Temp;
        for (int i = 1; i < a.length; i++) { //注意是从i=1开始的
            Temp = a[i];                    //必须要用Temp 否则移动过程中会改变a[i]的值
            int j;
            for (j = i - 1; j >= 0; j--) {  //从已经排好的序列中的末尾(即最大的开始比较),即是从0~i-1与a[j]比较 
                if (a[j] > Temp)
                    a[j + 1] = a[j];
                else {
                    a[j + 1] = Temp; //因为之前j--了一次
                    break;
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] a = {1, 2, 4, 623, 1, 132, 634, 2, 3, 4};
        insertSort(a);
        for (int i : a) {
            System.out.println(i);
        }
    }
}



3快速排序

3.1原理简述

  • 找一个基准数,将大于这个基准数的数放在右边,小于它的放在其左边
  • 排序算法

3.2源代码

    public class QuickSort {

        private static void quickSort(int[] a, int left, int right) {
    //        将a分成一边大的,一边小的,重复执行这个过程
            if (left < right) {
                int index = getIndex(a, left, right);
                quickSort(a, left, index - 1);
                quickSort(a, index + 1, right);
            }
        }

        private static int getIndex(int[] a, int left, int right) {

            int standard = a[left]; // 基准数据
            while (left < right) {
                while (left < right && a[right] >= standard) { //必须要 >= 不然 =等于那个得不到处理 left也指不到这边
                    right--;                                   // 当队尾的元素大于等于基准数据时,向前挪动high指针
                }
                a[left] = a[right];                            //将小于基准数据的值放到左边(小的一边)
                while (left < right && a[left] <= standard) {
                    left++;
                }
                a[right] = a[left];                           //将大于基准数据的值放到右边(大的一边)
            }
            a[left] = standard;                               //此时left==right 同时这个位置也是standard的位置
            return left;
        }

        public static void main(String[] args) {
            int[] a = {1, 2, 4, 2, 21, 563, 1, 6246, 13, 4331};
            quickSort(a, 0, a.length - 1);
            for (int i : a) {
                System.out.println(i);
            }
        }
    }



4选择排序

4.1原理简述:

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

  • ![选择排序](排序算法

4.2源代码

    public class SelectSort {
        private static void select(int[] a) {
            for (int i = 0; i < a.length; ++i) {
                int index = i;
                for (int j = i + 1; j < a.length; j++) {
                    if (a[index] > a[j]) {
                        index = j; // 找到当前循环中最小的数的索引
                    }
                }
                int temp = a[index];
                a[index] = a[i];
                a[i] = temp;
            }
        }

        public static void main(String[] args) {

            int[] a = {2, 1, 63, 2, 12, 7, 3, 12, 78, 6, 43};
            select(a);
            for (int i : a) {
                System.out.println(i);
            }

        }
    }




5希尔排序

5.1原理简述

希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

![希尔排序](排序算法

5.2源代码

    public class ShellSort {
        private static void shell(int[] a) {
            int gap = a.length / 2;  //增量,每隔gap为一组
            while (gap >= 1) {
                for (int i = gap; i < a.length; i++) { //依次遍历每一组 i=gap是因为后面的j-gap才有意义
                    int j = i;
                    while (j - gap >= 0 && a[j] < a[j - gap]) { //遍历每一组 如何发现后面的小于前面的则交换
                        int temp = a[j];                        //这里不采用每次给j+gap是因为 会有gap个a[j]遍历不到 换种方法也会比较麻烦
                        a[j] = a[j - gap];
                    a[j - gap] = temp;

                        j = j - gap;
                    }
                }
                gap = gap / 2;
            }
    }

        public static void main(String[] args) {
            int[] a = {3, 2, 5, 7, 43, 12, 15, 33, 15, 2, 12, 14, 3};
            shell(a);
            for (int i : a) {
                System.out.println(i);
            }
        }
    }

参考