经典排序算法总结(Java实现)
经典排序算法主要包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序等,这里用Java语言实现这些排序算法。
冒泡排序
基本思想
两个数比较大小,较大的数下沉,较小的数冒起来。
过程
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对第0个到第n-1个数据做同样的工作。这时,最大的数就“浮”到了数组最后的位置上。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
源代码
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;
}
}
}
}优化后:
选择排序
基本思想
不断遍历数组找到最小数字交换到数组前面
过程
在长度为n的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换;
第二次遍历n-2个数,找到最小的数值与第二个元素交换;
......
第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。
源代码
插入排序
基本思想
在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
过程
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果被扫描的元素(已排序)大于新元素,将该元素后移一位
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后
重复步骤2~5
源代码
希尔排序
基本思想
希尔排序,也称递减增量排序算法,实质是分组插入排序。 在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。
过程

源代码
快速排序
基本思想
分治法思想
过程
从数列中挑出一个元素作为基准数;
分区过程,将比基准数大的放到右边,小于或等于它的数都放到左边;
再对左右区间递归执行第二步,直至各区间只有一个数。
源代码
归并排序
基本思想
归并排序的思想就是先递归分解数组,再合并数组。
过程
先考虑合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。
再考虑递归分解,基本思路是将数组分解成left和right,如果这两个数组内部数据是有序的,那么就可以用上面合并数组的方法将这两个数组合并排序。如何让这两个数组内部是有序的?可以再二分,直至分解出的小组只含有一个元素时为止,此时认为该小组内部已有序。然后合并排序相邻二个小组即可。
源代码
堆排序
基本思想
堆排序是采用二叉堆的数据结构来实现的,虽然实质上还是一维数组。二叉堆是一个近似完全二叉树 。 二叉堆具有以下性质:
父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值。
每个节点的左右子树都是一个二叉堆(都是最大堆或最小堆)。
过程
构造最小堆
堆排序:由于堆是用数组模拟的。得到一个小根堆后,数组内部并不是有序的。因此需要将堆化数组有序化。
源代码
总结

Last updated