接下来两天重新看看几种常用的排序算法。
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 }