排序算法总结(上)

排序算法总结(上)

  • 首先先给自己大三下学期定下一个小目标:找到暑假实习公司。

  • 因为看了很多学长学姐写的面试经验,觉得数据结构和算法是必问的内容。想想自己对这方面的脑容量为零。

  • 所以在正式面试之前好好恶补一下!!!

1.直接插入算法

  • 思路: 默认前面的数据全部都是已经排好的,然后依次将后面的数据插入到合适的位置

  • 时间复杂度:O(n^2)

  • 最佳复杂度:O(n)/已经全部排好

图解

这里写图片描述

代码实现:
public static void insertSort(int a[]) {
        for (int i = 1; i < a.length; i++) {
            if (a[i - 1] > a[i]) {// 注意[0,i-1]都是有序的。如果待插入元素比a[i-1]还大则无需再与[i-1]前面的元素进行比较了,反之则进入if语句
                int temp = a[i];
                int j;
                for (j = i - 1; j >= 0 && a[j] > temp; j--) {
                    a[j + 1] = a[j];// 把比temp大或相等的元素全部往后移动一个位置
                }
                a[j + 1] = temp;// 把待排序的元素temp插入腾出位置的(j+1)
            }
        }
        System.out.println("");
        System.out.println("****1.直接排序之后****:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + ",");
        }

    }

2.希尔排序

  • 思路:希尔排序就是将插入排序基础上的将原来的间隔由1变为:(n/2),(n/4),(n/8)…直到n=1;n为数组的长度

  • 时间复杂度:O(n^1.3)

图片解释

这里写图片描述

代码实现:
public static void shellInsertSort(int a[], int n, int dk) {
        if (n < 2)
            return;
        for (int i = dk; i < n; i++) {
            if (a[i - dk] > a[i]) {
                int key = a[i];
                int j;
                for (j = i - dk; j >= 0 && a[j] > key; j -= dk) {
                    a[j + dk] = a[j];
                }
                a[j + dk] = key;
            }
        }
    }

    public static void shellSort(int a[]) {
        int n = a.length;
        int dk = n / 2;
        while (dk >= 1) {
            shellInsertSort(a, n, dk);
            dk /= 2;
        }
        System.out.println("");
        System.out.println("****2.希尔排序之后****:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + ",");
        }
    }

3.选择排序

  • 思路:每次都选择一个最大值放在最后面,选择一个最小值放在前面,(就是将当前的数和后面所有的数比较,找到一个最小的数进行交换)

  • 时间复杂度:O(n^2)

图片解释

这里写图片描述

代码实现:
public static void selectSort(int a[]) {
        if (a.length < 2)
            return;
        for (int i = 0; i < a.length - 1; i++) {
            int min = i;
            for (int j = i + 1; j < a.length; j++) {
                // 将当前的和后面的进行对比,找出一个比当前还要小的然后和当前的进行互换位置
                if (a[j] < a[min]) {
                    min = j;
                }
            }
            if (min != i) {
                int temp = 0;
                temp = a[i];
                a[i] = a[min];
                a[min] = temp;
            }
        }
        System.out.println("");
        System.out.println("****3.选择排序之后:****");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + ",");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值