Java数据结构与算法(二)--简单排序
目录
为了对大量的数据进行检索,需要对数据进行排序,就像上章讲的,二分查找要快于迭代查找。
由于排序非常耗时且十分重要,它已经成为计算机中相当重要的课题。
这章将要讲三个时间复杂度都为O(N2)的简单排序:冒泡排序/选择排序/插入排序
1.冒泡排序
冒泡排序就像水中的泡泡从水底升上来,不断变大一样。
每次排序将最大的数据冒上来(两两比较,将大的交换到后面或前面),最大的数设为已排,再去不断排序未排序的序列
排序过程可以参考下图:

代码如下:
/** * 冒泡排序 */ public class BubbleSort { public static int[] sort(int[] arr){ int len = arr.length; int temp; for (int i = 1; i < len; i++) { boolean flag = false; for (int j = 0; j < len-i; j++) { if(arr[j]>arr[j+1]){ temp = arr[j+1]; arr[j+1]= arr[j]; arr[j]=temp; flag = true; } } //可能存在没到最后一轮就已经排序完的情况 //设置一个标识,当该轮没有交换的时候表示排序结束 if(!flag)break; //看下每轮排序后的排序情况 System.out.println("第"+i+"轮排序后,排序结果:"); display(arr); } return arr; } public static void display(int[] arr){ for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } System.out.println(); } public static void main(String[] args) { int[] arr = {3,4,7,5,1,2,9,6,8}; System.out.println("初始数据:"); display(arr); System.out.println("-----------------------------------------"); arr = sort(arr); System.out.println("-----------------------------------------"); System.out.println("排序完成结果:"); display(arr); } }
运行情况:

1.选择排序
上个冒泡排序可以发现,每轮排序的时候都要不停的交换数据使最大的数”冒“上来。
选择排序优化了交换次数,每次找到将待排数据的最小,将它放到最前面,即为最小数与最前面数据的交换,只需移动数据即可
排序过程参考下图:

代码如下:
/** * 选择排序 */ public class ChoiceSort { public static int[] sort(int[] arr){ int len = arr.length; int min = 0;//每轮找到的最小值 int temp; for (int i = 0; i < len-1; i++) { //将最小值放在最前面,前面数据不断有序 //未排数据范围不断缩小 for (int j = i+1; j < len; j++) { if(arr[j]<arr[min]){ min = j; } } //将找到的最小值与队列最前面比较 if(arr[min]<arr[i]){ temp = arr[i]; arr[i] =arr[min]; arr[min]=temp; } //看下每轮排序后的排序情况 System.out.println("第"+i+"轮排序后,排序结果:"); display(arr); } return arr; } public static void display(int[] arr){ for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } System.out.println(); } public static void main(String[] args) { int[] arr = {3,4,7,5,1,2,9,6,8}; System.out.println("初始数据:"); display(arr); System.out.println("-----------------------------------------"); arr = sort(arr); System.out.println("-----------------------------------------"); System.out.println("排序完成结果:"); display(arr); } }
运行情况:

1.插入排序
接下来将要讲我觉得基本排序中最重要的插入排序,它也是快排等高级排序在数据量不大时采用的排序方式
它的思想就是,从待排序列取数,不断插入已排数据的方式
排序过程参考下图:

代码如下:
/** * 插入排序 */ public class InsertSort { public static int[] sort(int[] arr){ int len = arr.length; for (int i = 0; i < len-1; i++) { //第1个数据默认有序,从后面开始排序 int j = i+1; //待排数据插入有序序列时,待排数据是一个不断前移的过程 //可以直接获取待排序列,将有序序列后移,达到边界条件时:j=0 或 待排数据大于等于前面的数据 //将待排数据插入该位置 int temp = arr[j]; while(j>0 && temp<arr[j-1]){//未达到边界条件,不断后移,腾出待排数据的位置 arr[j]=arr[--j]; } arr[j]=temp; //看下每轮排序后的排序情况 System.out.println("第"+(i+1)+"轮排序后,排序结果:"); display(arr); } return arr; } public static void display(int[] arr){ for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+" "); } System.out.println(); } public static void main(String[] args) { int[] arr = {3,4,7,5,1,2,9,6,8}; System.out.println("初始数据:"); display(arr); System.out.println("-----------------------------------------"); arr = sort(arr); System.out.println("-----------------------------------------"); System.out.println("排序完成结果:"); display(arr); } }
运行情况:

4.总结
虽然上述算法的时间复杂度都为O(N2)但某些情况,某些算法会优于某些算法
冒泡排序最简单但一般情况不采用
插入排序是应用到最多的排序方法
接下来我们会讲到一些高级算法,将介绍一些时间复杂度小于O(N2)的算法

浙公网安备 33010602011771号