几种常用排序算法之一(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 }
原文地址:https://www.cnblogs.com/ttpn2981916/p/6395672.html