zoukankan      html  css  js  c++  java
  • 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("
    使用冒泡排序的结果为:");
     9         Sort.bubbleSort(arr);        //调用Sort类的bubbleSort()方法
    10         System.out.println("
    使用选择排序的结果为:");
    11         Sort.selectSort(arr);        //调用Sort类的selectSort()方法
    12         System.out.println("
    使用插入排序的结果为:");
    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

  • 相关阅读:
    “Swift Language Version” (SWIFT_VERSION) build setting must be set to a supported value for targets which use Swift
    webSocket通讯
    动画效果
    史上最简单MySQL教程详解(进阶篇)之视图
    “野生”程序猿写博客一年的感悟
    成都“小甜甜”:她给了男人希望,男人却被嘲笑X丝
    史上最简单MySQL教程详解(进阶篇)之索引及失效场合总结
    SpringBoot简明教程之快速创建第一个SpringBoot应用
    史上最简单MySQL教程详解(进阶篇)之深入理解事务处理内部的动作
    史上最简单MySQL教程详解(进阶篇)之锁与事务处理分离水平(二)
  • 原文地址:https://www.cnblogs.com/loober/p/9877567.html
Copyright © 2011-2022 走看看