详细讲解-经典排序

排序是数据结构体系中最重要的内容之一,下面内容为自己学习总结的内容,不正确之处还望指出:标注:这篇文章主要讲解每种排序的思想,无代码实现

一.排序分类

二、基本概念及各排序对应的时间复杂度

时间复杂度:算法中基本操作重复执行的次数, 用T(n)=O(f(n))表示;关于时间复杂度的计算需要注意两点:(1)忽略掉常数项(2)关注运行时间的增长趋势,关注函数式中增长最快的表达式,忽略系数

常用的时间复杂度分为以下几种,算法时间复杂度依次增加:

O(1)常数型、O(log2 n)对数型、O(n)线性型、O(nlog2n)二维型、O(n^2)平方型、O(n^3)立方型、O(2^n)指数型.

空间复杂度:计算整个算法的辅助空间单元的个数,与问题的规模没有关系。

稳定性:假定在待排的记录序列中,存在多个具有相同关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这种算法是稳定的,否则为不稳定

三、排序讲解

在读一篇文章时,在这里提到了迭代(iterator)与递归(recursive)的区别,我们在这里也将它作为了解:

迭代:指的是循环往复执行某操作,由旧值推新值,每一次对过程的重复称为一次迭代,每一次迭代的结果回作为下一次迭代的初始值。

递归:程序在运行中直接直接自己调用自己,递归算法要求由边界条件,递归前端,递归返回段,当边界条件满足时,递归返回值,反之递归前端。

光看概念很蒙,我们来个例子:

package com.iss;
public class DdTest {
    public static void main(String[] args) {
        DdTest ddTest = new DdTest();
        int n = ddTest.factorial(5);
        int iterator = DdTest.Iterator(5);
        System.out.println("迭代结果:" + iterator);
        System.out.println("递归结果:" + n);
    }
    //递归方法
    public int factorial(int number) {
        if (number <= 1) {
            return 1;
        } else {
            return number * factorial(number - 1);
        }
    }
    //迭代方法
    public static int Iterator(int number) {
        int preduct = 1;
        for (int i = 1; i <= number; i++) { //重复执行的地方
            preduct = preduct * (i);
        }
        return preduct;
    }
}

下面讲解排序的思想:(按照自己学习理解,不恰当之处还望指正)

(一)交换排序类

1.冒泡排序:以此比较两个相邻的元素,如果前一个比后一个大,则交换位置

根据图片可以看出每一趟排序都可以挑选出一个最大值

2.快速排序

做快速排序定义三个变量:temp:基数 即每个数都和他做比较

                                           begin:序列开头(把begin和end看做指针)

                                           end:序列末尾

步骤:(1)选的基数

           (2)从end开始,找到第一个比基数小的数,与基数交换位置。接下来该begin

           (3)接着从begin开始,找到第一个比基数大的数,与基数交换位置。如此往复

           (4)知道begin和end相遇,则结束此次排序

从结果可以看到排序记录被独立分为两个部分,左边记录小于基数、 右边记录大于基数。按照步骤对左右两个序列继续上述操作,则实现排序。

(二)插入排序类

1.直接插入排序

执行的每一步,将一个待排序列的记录,插入到前面已经排好序的有序序列中去。

2.希尔排序

希尔排序类似于插入排序的操作,但希尔排序并不是把每组记录看成一个整体,而将整个记录分成若干组,然后对每组记录进行插入排序。考虑希尔排序那么就要记得增量这个词,下面通过实例来感受一下希尔排序。

例:希尔排序将序列{10,18,4,3,6,12,1,9,15,8 } 增量5,3,1

d{5,3,1}

d=5 

d=3 

d=1  

(三)选择排序类

1.简单选择排序

每一趟从待排数据中选择最小或最大的一个元素作为首元素,直到所有元素排完为止,为不稳定排序(这个很简单理解,这里不做讲解)

2.堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。(网上down下来的,看看就好,核心下面讲解)

首先理解几个简单地概念

完全二叉树:除最后一层其他每一层均被完全填充,所有节点向左对齐

满二叉树:除叶子结点,每个节点都有两个孩子

大顶堆:父级元素大于或等于子级元素

小顶堆:父级元素小于或等于子级元素

理解了这些概念,让我们来看如何进行堆排序,步骤如下:

(1)将待排的数组构造成一个大顶堆 (2)将顶端的元素与末尾交换 (3)将剩余的n-1个数在造成大根堆

例:4 6 8 5 9

(四)归并排序

将一个数组中的每一个元素都看成一个有序序列,然后将相邻两个有序序列,合并成一个有序序列

好啦 关于排序的简单讲解就到这里。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值