排序是数据结构体系中最重要的内容之一,下面内容为自己学习总结的内容,不正确之处还望指出:标注:这篇文章主要讲解每种排序的思想,无代码实现
一.排序分类
二、基本概念及各排序对应的时间复杂度
时间复杂度:算法中基本操作重复执行的次数, 用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
(四)归并排序
将一个数组中的每一个元素都看成一个有序序列,然后将相邻两个有序序列,合并成一个有序序列
好啦 关于排序的简单讲解就到这里。