• 几种常用排序算法之一(bubble、select、insert、shell、未完待续)


    接下来两天重新看看几种常用的排序算法。

    1、冒泡排序法

    每次从 i=0开始比较相邻的元素,若arr[i]>arr[i+1],则交换它们。直到把最大的元素推向最后。回到 i=0,直至完成。

     1 import java.util.Scanner;
     2 class bubble 
     3 {
     4     public static void main(String[] args) 
     5     {
     6         int n,temp;
     7         int i,j;
     8         int[] arr=new int[10000];
     9         Scanner scanner=new Scanner(System.in);
    10 
    11         System.out.printf("输入n=");
    12         n=scanner.nextInt();
    13 
    14         System.out.printf("输入n个数:");
    15         for(i=0;i<n;i++)
    16             arr[i]=scanner.nextInt();
    17 
    18         for(i=0;i<n;i++)
    19         {
    20            for(j=0;j<n-1-i;j++)
    21            {
    22              if(arr[j]>arr[j+1])//每次总是与相邻的元素进行交换
    23              {
    24                 temp=arr[j];
    25                 arr[j]=arr[j+1];
    26                 arr[j+1]=temp;
    27              }
    28            }
    29         }
    30 
    31         for(i=0;i<n;i++)
    32             System.out.printf("%3d",arr[i]);
    33         System.out.printf("
    ");
    34   }
    35 }

    2、选择法

    从 i=0开始,把arr[i]与其后的每一个元素比较,把最小的元素放在当前位置。递增 i,把余下最小元素放在当前i位置,直至完成。

     1 import java.util.Scanner;
     2 class select 
     3 {
     4     public static void main(String[] args) 
     5     {
     6         int i,j,h;
     7         int[] arr=new int[10000];
     8         int temp,n;
     9 
    10         Scanner scanner=new Scanner(System.in);
    11         System.out.printf("输入n=");
    12         n=scanner.nextInt();
    13         System.out.printf("输入n个数:");
    14         for(i=0;i<n;i++)
    15            arr[i]=scanner.nextInt();
    16         
    17         for(i=0;i<n;i++)
    18         {
    19            h=i;
    20            for(j=i+1;j<n;j++)
    21            {
    22               if(arr[h]>arr[j])
    23                   h=j;
    24            }
    25            if(i!=h)      //i!=h时才需要交换,否则i的位置即是最小的
    26            {
    27               temp=arr[i];
    28               arr[i]=arr[h];
    29               arr[h]=temp;
    30            }
    31         }
    32         for(i=0;i<n;i++)
    33           System.out.printf("%3d",arr[i]);
    34         System.out.printf("
    ");
    35     }
    36 }

    3、插入排序

    把待排序的元素插入已排序序列的合适位置。

     1 import java.util.Scanner;
     2 class insert 
     3 {
     4     public static void main(String[] args) 
     5     {
     6         int i,j;
     7         int temp,n;
     8         int[] arr=new int[10000];
     9 
    10         Scanner scanner=new Scanner(System.in);
    11         System.out.printf("输入n=");
    12         n=scanner.nextInt();
    13         System.out.printf("输入n个数:");
    14         for(i=0;i<n;i++)
    15             arr[i]=scanner.nextInt();
    16 
    17         for(i=0;i<n;i++)
    18         {
    19            temp=arr[i];
    20            for(j=i-1;j>=0 && arr[j]>temp;j--)//把当前元素arr[i]插入前面已排序的序列中。
    21            {
    22                arr[j+1]=arr[j];
    23            }
    24            arr[j+1]=temp;
    25         }
    26 
    27         for(i=0;i<n;i++)
    28           System.out.printf("%3d",arr[i]);
    29         System.out.printf("
    ");
    30     }
    31 }

    4、希尔排序

    希尔排序通过调整步长 k 使得元素每一次移动的距离更长。步长 k 递减,当k=1时,实际上即是插入排序法。

     1 import java.util.Scanner;
     2 class shell 
     3 {
     4     public static void main(String[] args) 
     5     {
     6         int i,j;
     7         int temp,n,k;
     8         int[] arr=new int[10000];
     9 
    10         Scanner scanner=new Scanner(System.in);
    11         System.out.printf("输入n=");
    12         n=scanner.nextInt();
    13         System.out.printf("输入n个数:");
    14         for(i=0;i<n;i++)
    15             arr[i]=scanner.nextInt();
    16 
    17         k=n/2;
    18         while(k>=1)//k=1时即是插入排序
    19         {
    20            for(i=k;i<n;i+=k)
    21            {
    22               temp=arr[i];
    23               for(j=i-k;j>=0 && arr[j]>temp;j-=k)
    24               { 
    25                arr[j+k]=arr[j];
    26               }
    27               arr[j+k]=temp;
    28            }
    29            k/=2;//步长递减
    30         }
    31 
    32         for(i=0;i<n;i++)
    33           System.out.printf("%3d",arr[i]);
    34         System.out.printf("
    ");
    35     }
    36 }
  • 相关阅读:
    springboot的@ConditionalOnBean注解
    深入理解springboot的自动注入
    在线就能用的 SQL 练习平台(附SQL学习文档)
    数据智能——DTCC2022!中国数据库技术大会即将开幕
    Flex & Bison 开始
    架构师的快速成长 lcl
    隐私计算FATE离线预测
    求求你们,别再刷 Star 了!这跟“爱国”没关系!
    tauri+vue开发小巧的跨OS桌面应用股票体检
    从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能
  • 原文地址:https://www.cnblogs.com/ttpn2981916/p/6395672.html
Copyright © 2020-2023  润新知