Java的各种排序算法详解

来源:互联网 发布:韩子高网络剧下百度云 编辑:程序博客网 时间:2024/06/05 10:27

首先最经典的冒泡排序

从第一个元素开始冒泡,即依次与后边的元素进行比较,若是大于后边的则二者进行交换,一直重复这个过程,直到一次完整的迭代后不再有顺序的改变停止,应该就是所有元素的从小至大排列的顺序了。

代码演示:

import java.util.Arrays;public class SortAr {public static int[] numbers = {3,5,1,8,9};public static void main(String[] args){bubbleSort(numbers);System.out.print(Arrays.toString(numbers));}public static void bubbleSort(int[] numbers){boolean numbersSwitched;do{numbersSwitched = false;for(int i = 0; i < numbers.length - 1; i++){if(numbers[i + 1] < numbers[i]){int temp = numbers[i + 1];numbers[i + 1] = numbers[i];numbers[i] = temp;numbersSwitched = true;}}}while(numbersSwitched);}}


插入排序

这个排序算法涉及两个列表,一个是给定的列表一个是新的列表,把给定的列表中的元素逐一插入新的列表(按顺序)直到最后插入结束为止,返回这个新的列表


代码举例:

import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;import java.util.List;public class SortAr {private static List<Integer> number = new ArrayList<Integer>() {{         add(3);         add(5);         add(1);         add(9);        add(8);}}; public static void main(String[] args){List<Integer> numbers = insertSort(number);System.out.print(numbers);}//插入排序public static List<Integer> insertSort(final List<Integer> numbers){final List<Integer> sortedList = new LinkedList<>();orginalList: for (Integer number : numbers){for(int i = 0; i < sortedList.size(); i++){if(number < sortedList.get(i)){sortedList.add(i, number);continue orginalList;}}sortedList.add(sortedList.size(), number);}return sortedList;}}

这个函数返回的是一个新的list所以需要创建一个list来进行接收返回值,然后打印出这个list。

插入排序不好的地方是浪费空间,需要建两个list,这个当数据量变大时显得不划算,而且算法的复杂度最坏情况还是n方,没得说。



快速排序

这个算法的关键思想是随意地找到一个轴,也就是随意地找个元素来做轴,根据其他元素与这个轴的大小比较从而分为两组,一组全比轴的值来的大,另一组则小于轴,接下来使用递归的方式,对每一个组再次任意寻找一个轴分为两组进行排序,反复的进行下去,这样就会得到排序完成的最后结果。


代码举例:

//快速排序public static List<Integer> quicksort(List<Integer> numbers){if(numbers.size() < 2){return numbers;}final Integer pivot = numbers.get(0);final List<Integer> lower = new ArrayList<>();final List<Integer> higher = new ArrayList<>();for (int i = 1; i < numbers.size(); i++){if(numbers.get(i) < pivot){lower.add(numbers.get(i));}else{higher.add(numbers.get(i));}}final List<Integer> sorted = quicksort(lower);sorted.add(pivot);sorted.addAll(quicksort(higher)); return sorted;}

归并排序

典型的分治的思想,将列表分为两个自列表,分别对这两个子列表进行排序,最后将有序的子列表进行归并到一个列表的操作。

具体的操作主要是在归并的过程,每一个子列表有一个指针,选择两个指针中所指较小的一个添加到最终的列表中,然后指针后移一位继续。其中当有一个列表到最后一个时将另一个列表的所有元素直接添加到最终的结果列表中去。


代码举例:

//归并排序public static List<Integer> mergesort(List<Integer> values){if(values.size() < 2){return values;}final List<Integer> leftHalf = values.subList(0, values.size()/2);final List<Integer> rightHalf = values.subList(values.size()/2, values.size());return merge(mergesort(leftHalf), mergesort(rightHalf));}private static List<Integer> merge(final List<Integer> left, final List<Integer> right){int leftPtr = 0;int rightPtr = 0;final List<Integer> merged = new ArrayList<>(left.size()+right.size());while(leftPtr < left.size() && rightPtr < right.size()){if(left.get(leftPtr) < right.get(rightPtr)){merged.add(left.get(leftPtr));leftPtr++;}else{merged.add(right.get(rightPtr));rightPtr++;}}while(leftPtr < left.size()){merged.add(left.get(leftPtr));leftPtr++;}while(rightPtr < right.size()){merged.add(right.get(rightPtr));rightPtr++;}return merged;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公司注销地税没有补齐怎么办 公司没有固定电话怎么办信用卡 申请信用卡公司没有固定电话怎么办 办理信用卡公司没有固定电话怎么办 江门市固话欠费停机后怎么办 物业交钥匙地面有裂缝怎么办 深圳交通卡丢了怎么办 没装etc走etc怎么办 找不到过敏源身体痒怎么办 微信客服电话打不通怎么办 华为手机网络信号不好怎么办 酷我好友动态加载不了怎么办? 米兔电话手表停机了怎么办 糖猫电话手表停机了怎么办 360电话手表停机了怎么办 小天才电话手表停机怎么办 移动手机卡不知道号码怎么办 天猫退款手机号换了怎么办 科目二考试脚抖怎么办 面试新工作没打电话怎么办 怀孕5个月胎位低怎么办 做业务很害怕打电话怎么办 固定电话总是接到骚扰电话怎么办 电话卡通话被限制了怎么办? 手机名单拉黑了怎么办 被苹果6s被拉黑怎么办 重庆福利企业解聘残疾职工怎么办 被银行拉入黑名单怎么办 借的钱还不起了怎么办 支付宝手机号空号了怎么办 到处贷不到钱了怎么办 还不起钱借不到怎么办 闯红灯收到短信不去扣分怎么办 被一家公司骗了怎么办 oppo手机无线网信号差怎么办 oppo手机无线网网速慢怎么办 电脑无法解析dns地址怎么办 vivox9手机卡顿反应慢怎么办 vivo手机设置成英文怎么办 wi-fi模块坏了怎么办 苹果手机dns被劫持怎么办