使用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 秒)

原文地址:https://www.cnblogs.com/yuhenabc/p/2881583.html