排序算法
在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定排序方式进行排列的一种算法。这句话是摘抄维基百科的描述。我按照自己的理解叙述下,首先我们需要明白什么是算法,算法我们可以理解成问题的解题步骤。举个通俗的例子,怎么把菜放进冰箱一般需要如下步骤:
- 开冰箱门
- 把菜放进冰箱
- 关冰箱门
计算机不像人类这样具有自我分析、判断、决策能力,只能明确的执行一个个清晰的指令。因此当你跟计算器说请把菜放进冰箱,它是不知道怎么做的,你必须明确的告知计算机把菜放进冰箱的详细步骤。明白了算法是怎么一回事,我们就能很容易的明白排序算法是怎么一回事了。通俗来讲就是把一堆数据按照特定的规则进行排序的解题步骤。排序算法要解决的就是怎么把数字从大到小排序,怎么把人按照高低进行排序等等此类问题,排序算法归纳总结了怎么把这些数据按照特定规则排序的通用步骤。
写作目的
写这些文章是为了记录目前常见的排序算法及其背后的相关思想,对以前零散的知识做一个比较系统和完整的总结。
文章说明
- 为了把重心放置在排序算法核心思想上,不对排序算法的其他部分进行展开,如其算法的时间复杂度、空间复杂度等。
- 为了最简单化的分析和实现代码,使用整型数组进行排序来讲解。当然排序算法适合一切可比较的对象,大家可以使用
Comparable
和Comparator
来定义对象的比较规则来适应排序算法。 - 文章大部分都是使用文字进行讲解,一切能用文字说明的部分都不想用图片和动态图来说明(说到底自己太懒)。
- 排序算法这系列文章打算花大概七篇左右来讲解目前市面上主流的排序算法:冒泡排序,选择排序,插入排序,快速排序,堆排序,归并排序,希尔排序。其他的排序算法如:计数排序,桶排序,基数排序等排序算法因为比较少见暂时不打算对其展开分析。
- 算法统一使用
Java
语言进行实现。
通用代码
排序算法一般都涉及两个元素之间的比较和交换等步骤。为了代码的复用和最小化不影响排序算法本身,打算将这些共用的代码抽象成一个公有的类。
public class CommonUtils {
public static final int[] unSortArray() {
return new int[]{49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 1};
}
public static final void printArray(int[] arr) {
assert arr != null;
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
if (i < arr.length - 1) {
sb.append(",");
}
}
sb.append("]");
System.out.println(sb.toString());
}
public static final void swap(int[] arr, int i, int j) {
assert arr != null;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
其中unSortArray
是生成未排序的整数数组,printArray
是打印整数数组,swap
是交换两个整型数字。
测试代码
为了方便观察算法排序前后的整型数组,我们统一使用下列代码进行测试。
public static void main(String[] args) {
int[] array = CommonUtils.unSortArray();
CommonUtils.printArray(array);
xxSort(array);
CommonUtils.printArray(array);
}
xxSort
代码是各个排序算法的核心实现,在排序前后进行打印输出来验证排序算法的正确性。