
文章插图
代码如下:
package com.ys.sort; public class ChoiceSort { public static int[] sort(int[] array){ //总共要经过N-1轮比较 for(int i = 0 ; i < array.length-1 ; i++){ int min = i; //每轮需要比较的次数 for(int j = i+1 ; j < array.length ; j++){ if(array[j]<array[min]){ min = j;//记录目前能找到的最小值元素的下标 } } //将找到的最小值和i位置所在的值进行交换 if(i != min){ int temp = array[i]; array[i] = array[min]; array[min] = temp; } //第 i轮排序的结果为 System.out.print("第"+(i+1)+"轮排序后的结果为:"); display(array); } return array; }//遍历显示数组 public static void display(int[] array){ for(int i = 0 ; i < array.length ; i++){ System.out.print(array[i]+" "); } System.out.println(); }public static void main(String[] args){ int[] array = {4,2,8,9,5,7,6,1,3}; //未排序数组顺序为 System.out.println("未排序数组顺序为:"); display(array); System.out.println("-----------------------"); array = sort(array); System.out.println("-----------------------"); System.out.println("经过选择排序后的数组顺序为:"); display(array); }}运行结果:

文章插图
选择排序性能分析:
选择排序和冒泡排序执行了相同次数的比较:N*(N-1)/2,但是至多只进行了N次交换 。
当 N 值很大时,比较次数是主要的,所以和冒泡排序一样,用大O表示是O(N2) 时间级别 。但是由于选择排序交换的次数少,所以选择排序无疑是比冒泡排序快的 。当 N 值较小时,如果交换时间比选择时间大的多,那么选择排序是相当快的 。
3、插入排序
直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止 。
插入排序还分为直接插入排序、二分插入排序、链表插入排序、希尔排序等等,这里我们只是以直接插入排序讲解,后面讲高级排序的时候会将其他的 。

文章插图

文章插图
代码如下:
package com.ys.sort; public class InsertSort { public static int[] sort(int[] array){ int j; //从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的 for(int i = 1 ; i < array.length ; i++){ int tmp = array[i];//记录要插入的数据 j = i; while(j > 0 && tmp < array[j-1]){//从已经排序的序列最右边的开始比较,找到比其小的数 array[j] = array[j-1];//向后挪动 j--; } array[j] = tmp;//存在比其小的数,插入 } return array; }//遍历显示数组 public static void display(int[] array){ for(int i = 0 ; i < array.length ; i++){ System.out.print(array[i]+" "); } System.out.println(); }public static void main(String[] args){ int[] array = {4,2,8,9,5,7,6,1,3}; //未排序数组顺序为 System.out.println("未排序数组顺序为:"); display(array); System.out.println("-----------------------"); array = sort(array); System.out.println("-----------------------"); System.out.println("经过插入排序后的数组顺序为:"); display(array); }}运行结果:

文章插图
【图解 轻松学习冒泡、选择、插入排序算法】
插入排序性能分析:
在第一轮排序中,它最多比较一次,第二轮最多比较两次,一次类推,第N轮,最多比较N-1次 。因此有 1+2+3+...+N-1 = N*(N-1)/2 。
假设在每一轮排序发现插入点时,平均只有全体数据项的一半真的进行了比较,我们除以2得到:N*(N-1)/4 。用大O表示法大致需要需要 O(N2) 时间级别 。
复制的次数大致等于比较的次数,但是一次复制与一次交换的时间耗时不同,所以相对于随机数据,插入排序比冒泡快一倍,比选择排序略快 。
这里需要注意的是,如果要进行逆序排列,那么每次比较和移动都会进行,这时候并不会比冒泡排序快 。
4、总结
上面讲的三种排序,冒泡、选择、插入用大 O 表示法都需要 O(N2) 时间级别 。一般不会选择冒泡排序,虽然冒泡排序书写是最简单的,但是平均性能是没有选择排序和插入排序好的 。
推荐阅读
-
[乐居财经]高层看好前景拟增持股票,金科股份无调整年度目标打算
-
虎扑篮球|凯尔特人本场首发:沃克、斯马特、布朗、塔特姆和泰斯
-
爱搞笑的老大妈|粉丝超过40万,莎拉波娃后网坛又现一女神!15岁肤白貌美颜值高
-
【生肖】未来1周,财神照顾,横财大发,贵人八方来,日子富裕美满的生肖
-
中国基金报|股价一度腰斩,宝马也撑不住了?6000个全职岗位被裁
-
|菜鸟赛季20+5+5史上仅5人,东契奇发力追前辈,一人出道即巅峰
-
都市星座说TB|爱人面前柔软的三个星座,外人面前高冷
-
青莳讲二次元|终于等到你,《秦时明月之沧海横流》要来了,喜大普奔
-
hao123@你还记得hao123导航网站吗?现在为什么都没人用了
-
贝鲁特|黎巴嫩贝鲁特爆炸已致154人死亡 大爆炸后黎巴嫩爆发反政府抗议
-
-
|浏览“黄网”没人知?手机出现下面几个情况,就要停手了!
-
娱乐小闻|女明星年轻的时候到底可以多美?蔡少芬告诉你答案
-
-
明星八卦|李易峰出席品牌活动;王俊凯、迪丽热巴、陈立农杂志封面公开;邓伦、李现等人新代言官宣;《斛珠夫人》今日全剧顺利杀青
-
-
-
-
#免疫#重症医生:“提高”免疫力的方法只有这 3 种,其他通通不靠谱
-
地面62℃,杭州大伯摔倒后二度烫伤!网友晒出一张图,更扎心了