经典排序算法总结(Java实现)

经典排序算法主要包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序等,这里用Java语言实现这些排序算法。

冒泡排序

基本思想

两个数比较大小,较大的数下沉,较小的数冒起来。

过程

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对第0个到第n-1个数据做同样的工作。这时,最大的数就“浮”到了数组最后的位置上。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

源代码

public void bubbleSort(int[] arr){
	for(int i=0;i<arr.length-1;i++){
		for(int j=i+1;j<arr.length;j++){
			if(arr[i]>arr[j]){
				int temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
			}
		}
	}
}

优化后:

选择排序

基本思想

不断遍历数组找到最小数字交换到数组前面

过程

  1. 在长度为n的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换;

  2. 第二次遍历n-2个数,找到最小的数值与第二个元素交换;

  3. ......

  4. 第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。

源代码

插入排序

基本思想

在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

过程

  1. 从第一个元素开始,该元素可以认为已经被排序

  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描

  3. 如果被扫描的元素(已排序)大于新元素,将该元素后移一位

  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

  5. 将新元素插入到该位置后

  6. 重复步骤2~5

源代码

希尔排序

基本思想

希尔排序,也称递减增量排序算法,实质是分组插入排序。 在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。

过程

经典排序算法总结(Java实现)1

源代码

快速排序

基本思想

分治法思想

过程

  1. 从数列中挑出一个元素作为基准数;

  2. 分区过程,将比基准数大的放到右边,小于或等于它的数都放到左边;

  3. 再对左右区间递归执行第二步,直至各区间只有一个数。

源代码

归并排序

基本思想

归并排序的思想就是先递归分解数组,再合并数组。

过程

  1. 先考虑合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。

  2. 再考虑递归分解,基本思路是将数组分解成left和right,如果这两个数组内部数据是有序的,那么就可以用上面合并数组的方法将这两个数组合并排序。如何让这两个数组内部是有序的?可以再二分,直至分解出的小组只含有一个元素时为止,此时认为该小组内部已有序。然后合并排序相邻二个小组即可。

源代码

堆排序

基本思想

堆排序是采用二叉堆的数据结构来实现的,虽然实质上还是一维数组。二叉堆是一个近似完全二叉树 。 二叉堆具有以下性质:

  1. 父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值。

  2. 每个节点的左右子树都是一个二叉堆(都是最大堆或最小堆)。

过程

  1. 构造最小堆

  2. 堆排序:由于堆是用数组模拟的。得到一个小根堆后,数组内部并不是有序的。因此需要将堆化数组有序化。

源代码

总结

经典排序算法总结(Java实现)2

排序算法总结|菜鸟教程 经典排序算法总结与实现

Last updated