Java循环语句怎么用?经典排序算法见真知
Java中循环语句的使用,莫过于在排序算法中使用得最为经典。
排序算法非常的多,不过大体可以分为两种:
一种是比较排序,主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。
另一种是非比较排序,主要有:计数排序,基数排序,桶排序等。本文主要讲解三大经典比较排序,了解其排序思想及代码实现。
下面通过对冒泡排序,选择排序,插入排序分析。使用最简洁最经典的循环语句实现对数据的排序。
一、冒泡排序(BubbleSort)
冒泡排序的原理:比较两个相邻的元素,将值大的元素交换至右端。
冒泡排序的基本思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较;
第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比较;
依次类推,每一趟比较次数-1;
……
图解分析:
Java代码实现:
1 public static void bubbleSort(int[] arr) { 2 for(int i=0;i<arr.length-1;i++) { //外层循环 3 for(int j=0;j<arr.length-1-i;j++) { //内层冒泡选择较大的值 4 if(arr[j+1]<arr[j]) { //判断后面的数是否比前面的数小,如果小,往前移动 5 int temp=arr[j]; 6 arr[j]=arr[j+1]; 7 arr[j+1]=temp; 8 } 9 } 10 } 11 }
二、选择排序(SelectSort)
选择排序的原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。(这里只介绍常用的简单选择排序)
简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数据,将它与arrr[1]交换;第2趟,在待排序数据arr[2]~arr[n]中选出最小的数据,将它与r[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小的数据,将它与r[i]交换,直到全部排序完成。
图解分析:
Java代码实现:
1 public static void selectSort(int[] arr) { 2 for(int i=0;i<arr.length-1;i++) { //外层循环 3 int k=i; //假设arr[0]为最小值 4 for(int j=k+1;j<arr.length;j++) { //内层选择当前序列最小值 5 if(arr[j]<arr[k]) { //判断后面的数是否比前面的数小,如果小,k下标标志刷新 6 k=j; 7 } 8 } 9 if(i!=k) { //如果当前的值下标非i为k,则进行进行交换下标为i与k的值(当前处于外层循环) 10 int temp=arr[i]; 11 arr[i]=arr[k]; 12 arr[k]=temp; 13 } 14 } 15 } 16 }
三、插入排序(InsertSort)
直接插入排序的原理:对于给定的一个数组,初始时假设第一个记录自成一个有序序列,其余记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一个记录插入到有序序列中为止。
图解分析:
Java代码实现:
1 public static void insertSort(int[] arr) { 2 for(int i=1;i<arr.length;i++) { //外层循环,从arr[1]开始 3 for(int j=i;j>0;j--) { //内层循环 4 if(arr[j]<arr[j-1]) { //后面无序数依次比较已成序的数值,如果小,则交换顺序 5 int temp=arr[j-1]; 6 arr[j-1]=arr[j]; 7 arr[j]=temp; 8 } 9 } 10 } 11 }
最后我把三大排序算法写入一个Sort类中:
1 public class Sort { 2 3 //冒泡排序方法 4 public static void bubbleSort(int[] arr) { 5 for(int i=0;i<arr.length-1;i++) { //外层循环 6 for(int j=0;j<arr.length-1-i;j++) { //内层冒泡选择较大的值 7 if(arr[j+1]<arr[j]) { //判断后面的数是否比前面的数小,如果小,往前移动 8 int temp=arr[j]; 9 arr[j]=arr[j+1]; 10 arr[j+1]=temp; 11 } 12 } 13 } 14 for (int i : arr) { 15 System.out.print(i+" "); 16 } 17 } 18 19 //选择排序方法 20 public static void selectSort(int[] arr) { 21 for(int i=0;i<arr.length-1;i++) { //外层循环 22 int k=i; //假设arr[0]为最小值 23 for(int j=k+1;j<arr.length;j++) { //内层选择当前序列最小值 24 if(arr[j]<arr[k]) { //判断后面的数是否比前面的数小,如果小,k下标标志刷新 25 k=j; 26 } 27 } 28 if(i!=k) { //如果当前的值下标非i为k,则进行进行交换下标为i与k的值(当前处于外层循环) 29 int temp=arr[i]; 30 arr[i]=arr[k]; 31 arr[k]=temp; 32 } 33 } 34 for (int i : arr) { 35 System.out.print(i+" "); 36 } 37 } 38 39 //插入排序方法 40 public static void insertSort(int[] arr) { 41 for(int i=1;i<arr.length;i++) { //外层循环,从arr[1]开始 42 for(int j=i;j>0;j--) { //内层循环 43 if(arr[j]<arr[j-1]) { //后面无序数依次比较已成序的数值,如果小,则交换顺序 44 int temp=arr[j-1]; 45 arr[j-1]=arr[j]; 46 arr[j]=temp; 47 } 48 } 49 } 50 for (int i : arr) { 51 System.out.print(i+" "); 52 } 53 } 54 }
接下来,书写一个Test类:
1 public class Test { 2 public static void main(String[] args) { 3 int[] arr=new int[] {9,6,11,4,3,1,7}; //此数组可自行更改 4 System.out.println("原数组为:"); 5 for (int i : arr) { 6 System.out.print(i+" "); 7 } 8 System.out.println("\n使用冒泡排序的结果为:"); 9 Sort.bubbleSort(arr); //调用Sort类的bubbleSort()方法 10 System.out.println("\n使用选择排序的结果为:"); 11 Sort.selectSort(arr); //调用Sort类的selectSort()方法 12 System.out.println("\n使用插入排序的结果为:"); 13 Sort.insertSort(arr); //调用Sort类的insertSort()方法 14 } 15 }
测试结果:
原数组为:
9 6 11 4 3 1 7
使用冒泡排序的结果为:
1 3 4 6 7 9 11
使用选择排序的结果为:
1 3 4 6 7 9 11
使用插入排序的结果为:
1 3 4 6 7 9 11