选择排序、插入排序、希尔排序

        1.选择排序

算法描述

  1. 将数组分为两个子集,排序的和未排序的,每一轮从未排序的子集中选出最小的元素,放入排序子集

  2. 重复以上步骤,直到整个数组有序

        选择排序呢,就是首先在循环中,找到数组中最小的元素。在每次遍历数组时,需要记录当前次遍历最小元素的索引值。然后有一个标志位i用来记录放置每次遍历最小元素的索引。

1.1代码实现

private static void selection(int[] a) {
        for (int i = 0; i < a.length - 1; i++) {
            // i 代表每轮选择最小元素要交换到的目标索引
            int s = i; // 代表最小元素的索引
            for (int j = s + 1; j < a.length; j++) {
                if (a[s] > a[j]) { // j 元素比 s 元素还要小, 更新 s
                    s = j;
                }
            }
            if (s != i) {
                swap(a, s, i);
            }
            System.out.println(Arrays.toString(a));
        }
    }

1.2冒泡比较

选择排序、插入排序、希尔排序_第1张图片

2.插入排序

算法描述

  1. 将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序)

  2. 重复以上步骤,直到整个数组有序

2.1代码实现

public static void insert1(int[] a) {
        // i 代表待插入元素的索引
        for (int i = 1; i < a.length; i++) {
            int t = a[i]; // 代表待插入的元素值
            int j = i - 1;

            while (j >= 0) {
                if (t < a[j]) {
                    a[j] = a[j - 1];
                } else {
                    break;
                }
                j--;
            }
            a[j + 1] = t;
            System.out.println(Arrays.toString(a));

        }
    }

2.2选择比较

选择排序、插入排序、希尔排序_第2张图片

3.希尔排序

算法描述

  1. 首先选取一个间隙序列,如 (n/2,n/4 … 1),n 为数组长度

  2. 每一轮将间隙相等的元素视为一组,对组内元素进行插入排序,目的有二

    ① 少量元素插入排序速度很快

    ② 让组内值较大的元素更快地移动到后方

  3. 当间隙逐渐减少,直至为 1 时,即可完成排序

        在选择排序中,存在着弊端,当比较大的元素存在于数组的前方,那么会进行多次操作,才能使数据移动到应有的位置。所以提出了选择排序的升级版--希尔排序

3.1代码实现

private static void shell(int[] a) {
        int n = a.length;
        for (int gap = n / 2; gap > 0; gap /= 2) {
            // i 代表待插入元素的索引
            for (int i = gap; i < n; i++) {
                int t = a[i]; // 代表待插入的元素值
                int j = i;
                while (j >= gap) {
                    // 每次与上一个间隙为 gap 的元素进行插入排序
                    if (t < a[j - gap]) { // j-gap 是上一个元素索引,如果 > t,后移
                        a[j] = a[j - gap];
                        j -= gap;
                    } else { // 如果 j-1 已经 <= t, 则 j 就是插入位置
                        break;
                    }
                }
                a[j] = t;
                System.out.println(Arrays.toString(a) + " gap:" + gap);
            }
        }

你可能感兴趣的:(algorithm,数据结构,排序算法,算法)