使用Java语言实现几种常见的排序算法
看官你好,我的初衷是复习数据结构中所学的各种算法,之前都是用C语言写的,这次改成了Java语言,感觉更简单一些。
为了容易分享,我把它写在一个类里面,都用了静态方法,莫怪!
算法功能:输入一个任意长度的整形数组,以String的形式输出数组的由小到大的排序结果。
下面则是全部代码:
1 public class Sort { 2 3 public static void main(String[] args) { 4 5 int a[]={12,56,95,35,88,102,89,63,154}; 6 String sa=mpSort(a); 7 System.out.println("数组A的排序结果是:"+sa); 8 9 int b[]={32,55,175,75,82,111,26,159}; 10 String sb=ksSort(b); 11 System.out.println("数组B的排序结果是:"+sb); 12 13 int c[]={137,555,186,45,92,150,48,360}; 14 String sc=crSort(c); 15 System.out.println("数组C的排序结果是:"+sc); 16 } 17 18 //不排序 19 public static String noSort(int arr[]) 20 { 21 String s=" "; 22 for(int i=0;i<arr.length;i++) 23 { 24 s=s+arr[i]+" "; 25 } 26 return s; 27 } 28 29 //冒泡排序 30 public static String mpSort(int arr[]) 31 { 32 String s=" "; 33 int temp; //temp 为交换时的暂存数据 34 boolean move; //move 判断是否有过交换 35 for(int i=1;i<arr.length;i++) // i 表示趟数,共arr.length-1趟 36 { 37 move=false; 38 for(int j=arr.length-1;j>=i;j--) 39 { 40 if(arr[j]<arr[j-1]) 41 { 42 temp=arr[j]; 43 arr[j]=arr[j-1]; 44 arr[j-1]=temp; 45 move=true; 46 } 47 } 48 if(!move) break; 49 } 50 for(int i=0;i<arr.length;i++) 51 { 52 s=s+arr[i]+" "; 53 } 54 return s; 55 } 56 57 //快速排序 58 public static String ksSort(int arr[]) 59 { 60 String s=" "; 61 quicksort(arr,0,arr.length-1); //初始以arr[0]为最低位,arr[arr.length-1]为最高位 62 for(int i=0;i<arr.length;i++) 63 { 64 s=s+arr[i]+" "; 65 } 66 return s; 67 } 68 //快速排序的分区算法,返回基准数据的下标 69 private static int partition(int arr[],int low,int high) 70 { 71 int key=arr[low]; //基准值赋给岗哨 72 while(low<high) 73 { 74 if(low<high && arr[high]>=key) 75 high--; 76 arr[low]=arr[high]; 77 if(low<high && arr[low]<=key) 78 low++; 79 arr[high]=arr[low]; 80 } 81 arr[low]=key; //空位填上基准值 82 return low; 83 } 84 //真正的快速排序:一种递归算法 85 private static void quicksort(int arr[],int low,int high) 86 { 87 if(low<high) 88 { 89 int result=partition(arr,low,high); 90 quicksort(arr,low,result-1); 91 quicksort(arr,result+1,high); 92 } 93 } 94 95 //插入排序 96 public static String crSort(int arr[]) 97 { 98 String s=" "; 99 int key; //key 表示岗哨,记录新增的数据 100 for(int i=2;i<=arr.length;i++) // i 表示有序区长度,从2开始递增,直到arr.length结束 101 { 102 if(arr[i-1]<arr[i-2]) //新增数据小于上一轮有序区最后一位 103 { 104 key=arr[i-1]; 105 for(int j=i-2;j>=0;j--) 106 { 107 if(j>0) 108 { 109 if(arr[j]>key) 110 { 111 arr[j+1]=arr[j]; //大于新增数据,则后移一位 112 } 113 else 114 { 115 arr[j+1]=key; //小于等于新增数据,则空位填上新增数据 116 break; 117 } 118 } 119 else //如果新增数据一直比较到arr[0],需要特殊处理 120 { 121 if(arr[0]>key) 122 { 123 arr[1]=arr[0]; 124 arr[0]=key; 125 } 126 else 127 arr[1]=key; 128 } 129 } 130 } 131 } 132 for(int i=0;i<arr.length;i++) 133 { 134 s=s+arr[i]+" "; 135 } 136 return s; 137 } 138 }
运行的结果:
数组A的排序结果是: 12 35 56 63 88 89 95 102 154
数组B的排序结果是: 26 32 55 75 82 111 159 175
数组C的排序结果是: 45 48 92 137 150 186 360 555
成功生成(总时间:0 秒)