zoukankan      html  css  js  c++  java
  • java实现几种简单的排序算法

      1 public class SimpleAri {
      2     public static void main(String[] args) {
      3         
      4         int[] t = {11, 21, 22, 1, 6, 10, 3, 2, 12, 9, 0, 15, 6, 19, 9, 32, 11, 8, 4, 7, 5, 3, 2};
      5         
      6 
      7 //        int[] a = test1();
      8         
      9         System.out.println("排序前:" + Arrays.toString(t));
     10 
     11         System.out.println("直接插入排序后:" + Arrays.toString(directSort1(t)));
     12         
     13         System.out.println("希尔排序后:" + Arrays.toString(directSort1(sheelSort(t))));
     14         
     15         System.out.println("简单选择排序后:" + Arrays.toString(directSort1(selectSort(t))));
     16         
     17         System.out.println("冒泡排序后:" + Arrays.toString(bubbleSort(t)));
     18         
     19         System.out.println("快速排序后:" + Arrays.toString(quickSort(t, 0, t.length-1)));
     20         
     21         System.out.println("归并排序后:" + Arrays.toString(mergeSort(t, 0, 2)));
     22         
     23         System.out.println("基数排序后:" + Arrays.toString(baseNumSort(t)));
     24         
     25         
     26     }
     27     
     28     //标准输入输出
     29     private static int[] test1() {
     30         Scanner scanner = new Scanner(System.in);
     31         int l=scanner.nextInt();
     32         int[] num = new int[l];
     33         for(int i = 0; i<l && scanner.hasNext(); i++){
     34             num[i] = scanner.nextInt();
     35         }
     36         return num;
     37     }
     38     
     39     /**
     40      * 1 直接插入排序
     41      * 对n个无序的数,进行直接插入排序(假设升序排列)
     42      * 1 拿出1个数
     43      * 2 拿出下一个数,与已有的数的序列比较,找到按升序排列应放的位置
     44      * 3 继续取数,进行第2步,直到把所有n个数排列完成
     45      * */
     46     
     47     //自己写的方法
     48     public static int[] directSort(int[] a){
     49         int[] b = new int[a.length];
     50         b[0] = a[0];
     51         for(int i = 1; i < a.length; i++){//取出a中的每个值
     52             int posion = i;          //把posion定位到数组b当前有意义的最大位的后一位,即第i位
     53             for(int j = 0; j < i; j++){//把取出的值和b中的比较并记录应在的位置到posion中
     54                 if(a[i]<b[j]){
     55                     posion = j;
     56                     break;//
     57                 }
     58             }
     59             for(int n = i; n > posion; n--){ //把b[posion]到b[i]都后移一位
     60                 b[n] = b[n-1];
     61             }
     62             b[posion] = a[i];
     63         }
     64         return b;
     65     }
     66     
     67     //网上大牛的方法
     68     public static int[] directSort1(int[] a){
     69         int length=a.length;//数组长度,将这个提取出来是为了提高速度。
     70         int insertNum;//要插入的数
     71         for(int i=1;i<length;i++){//插入的次数
     72             insertNum=a[i];//要插入的数
     73             int j=i-1;//已经排序好的序列元素最大位置
     74             while(j>=0&&a[j]>insertNum){
     75                 //序列从后到前循环,找到第一个大于insertNum的位置,
     76                 //并将这个位置到第i-1个位置的所有值向后移位覆盖一位
     77                 a[j+1]=a[j];//元素移动一格
     78                 j--;
     79             }
     80             a[j+1]=insertNum;//将需要插入的数放在要插入的位置。
     81         }
     82         return a;
     83     }
     84 
     85     
     86     /**
     87      * 2 希尔排序
     88      * 对于直接插入排序问题,数据量巨大时,用希尔排序解决
     89      * 希尔排序的原理就是先用小范围微调,微调方法就是局部用插入排序,增大局部顺序性,逐渐增加范围,直到所有数一起被调整。
     90      * 随着范围增大,数据整体的顺序性也越来越良好,降低了排序的复杂度
     91      * 方法:
     92      * 1)将数的个数设为n,取奇数k=n/2,将下标差值为k的数分为一组,构成有序序列。
     93      * 2)再取k=k/2 ,将下标差值为k的数分为一组,构成有序序列。
     94      * 3)重复第二步,直到k=1执行简单插入排序。
     95      * */
     96     public static int[] sheelSort(int[] a){
     97         int n = a.length;
     98         int k = n/2;
     99         for(int i=0; i<k; i++){             //根据k分组
    100             //分组插入排序
    101             for(int j=1; (i+j*k)<n; j++){   //分别取出组里的所有数据做插入排序
    102                 for(int x=0; x<j && (a[i+j*k]<a[i+x*k]); x++){//条件成立时,交换
    103                     int num = a[i+j*k];
    104                     a[i+j*k] = a[i+x*k];
    105                     a[i+x*k] = num;
    106                 }
    107             }
    108             k = k/2;
    109         }
    110         return a;
    111     }
    112     //网上的方法
    113     public static int[] sheelSort1(int[] a){
    114         int d  = a.length;
    115         while (d!=0) {
    116             d=d/2;
    117             for (int x = 0; x < d; x++) {//分的组数
    118                 for (int i = x + d; i < a.length; i += d) {//组中的元素,从第二个数开始
    119                     int j = i - d;//j为有序序列最后一位的位数
    120                     int temp = a[i];//要插入的元素
    121                     for (; j >= 0 && temp < a[j]; j -= d) {//从后往前遍历。
    122                         a[j + d] = a[j];//向后移动d位
    123                     }
    124                     a[j + d] = temp;
    125                 }
    126             }
    127         }
    128         return a;
    129     }
    130     
    131     /**
    132      * 3 简单选择排序
    133      * 步骤:
    134      * 1)遍历整个序列,将最小的数放在最前面。
    135      * 2)遍历剩下的序列,将最小的数放在最前面。
    136      * 3)重复第二步,直到只剩下一个数。
    137      * */
    138     //我的方法
    139     public static int[] selectSort(int[] a){
    140         for(int i=0; i<a.length-1; i++){
    141             int num = i;//最小数序号,默认为余下数组的顺序第一个数
    142             for(int j=i+1; j<a.length; j++){//找出最小数的序号
    143                 if(a[j]<a[num]){
    144                     num = j;
    145                 }
    146             }
    147             //交换
    148             int x = a[i];
    149             a[i] = a[num];
    150             a[num] = x;
    151         }
    152         return a;
    153     }
    154 
    155     //网上的方法(和我自己写的一样,顺序稍有不同)
    156     public static int[] selectSort1(int[] a) {
    157         int length = a.length;
    158         for (int i = 0; i < length; i++) {//循环次数
    159             int key = a[i];
    160             int position=i;
    161             for (int j = i + 1; j < length; j++) {//选出最小的值和位置
    162                 if (a[j] < key) {
    163                     key = a[j];
    164                     position = j;
    165                 }
    166             }
    167             a[position]=a[i];//交换位置
    168             a[i]=key;
    169         }
    170         return a;
    171     }
    172     
    173     /**
    174      * 4 冒泡排序
    175      * 1)将序列中所有元素两两比较,将最大的放在最后面。
    176      * 2)将剩余序列中所有元素两两比较,将最大的放在最后面。
    177      * 3)重复第二步,直到只剩下一个数。
    178      * */
    179     public static int[] bubbleSort(int[] a){
    180         for(int nums=a.length; nums>1; nums--){
    181             int index = 0;
    182             for(int i=1; i<nums; i++){
    183                 if(a[i] > a[index]){//找出最大值的坐标
    184                     index = i;
    185                 }
    186             }
    187             //交换最后一位和最大值
    188             int num = a[nums-1];
    189             a[nums-1] = a[index];
    190             a[index] = num;
    191         }
    192         return a;
    193     }
    194     //web上的方法
    195     public static int[] bubbleSort1(int[] a){
    196         for(int i=0; i<a.length; i++){//重复n次
    197             for(int j=0; j+1<a.length; j++){
    198                 if(a[j] > a[j+1]){
    199                     int num = a[j+1];
    200                     a[j+1] = a[j];
    201                     a[j] = num;
    202                 }
    203             }
    204         }
    205         return a;
    206     }
    207     
    208     /**
    209      * 5 快速排序
    210      * 选择第一个数为p,小于p的数放在左边,大于p的数放在右边。 
    211      * 递归的将p左边和右边的数都按照第一步进行,直到不能递归。
    212      * */
    213     public static int[] quickSort(int[] a, int start, int end) {   
    214         if (start < end) {   
    215             int base = a[start]; // 选定的基准值(第一个数值作为基准值)   
    216             int temp; // 记录临时中间值   
    217             int i = start, j = end;   
    218             do {   
    219                 while ((a[i] < base) && (i < end))   
    220                     i++;   //如果当前值小于基准值,那么符合小值在左规则,循环找下一个值,否则跳出
    221                 while ((a[j] > base) && (j > start))   
    222                     j--;   //如果当前值大于基准值,那么符合大值在右原则,循环找下一个值,否则跳出
    223                 if (i <= j) {   
    224                     temp = a[i];   
    225                     a[i] = a[j];   
    226                     a[j] = temp;   
    227                     i++;   
    228                     j--;   
    229                 }   
    230             } while (i <= j);   
    231             if (start < j)   
    232                 quickSort(a, start, j);   
    233             if (end > i)   
    234                 quickSort(a, i, end);   
    235         } 
    236         return a;
    237     }
    238     //网上的方法
    239     public static void quickSort1(int[] numbers, int start, int end) {   
    240         if (start < end) {   
    241             int base = numbers[start]; // 选定的基准值(第一个数值作为基准值)   
    242             int temp; // 记录临时中间值   
    243             int i = start, j = end;   
    244             do {   
    245                 while ((numbers[i] < base) && (i < end))   
    246                     i++;   
    247                 while ((numbers[j] > base) && (j > start))   
    248                     j--;   
    249                 if (i <= j) {   
    250                     temp = numbers[i];   
    251                     numbers[i] = numbers[j];   
    252                     numbers[j] = temp;   
    253                     i++;   
    254                     j--;   
    255                 }   
    256             } while (i <= j);   
    257             if (start < j)   
    258                 quickSort(numbers, start, j);   
    259             if (end > i)   
    260                 quickSort(numbers, i, end);   
    261         }   
    262     }
    263 
    264     
    265     /**
    266      * 6 归并排序
    267      * 1)选择相邻两个数组成一个有序序列。
    268      * 2)选择相邻的两个有序序列组成一个有序序列。
    269      * 3}重复第二步,直到全部组成一个有序序列。
    270      * */
    271     public static int[] mergeSort(int a[], int start, int step){
    272         if(start < a.length){
    273             //设置组的开头和结尾[,)  左开右闭
    274             int end = start + step;
    275             if(end <= a.length){
    276                 //排序算法
    277                 for(int i=start; i<end; i++){
    278                     int index = i;
    279                     for(int j = i; j<end; j++){
    280                         if(a[j] < a[index]){
    281                             index = j;
    282                         }
    283                     }
    284                     int num = a[i];
    285                     a[i] = a[index];
    286                     a[index] = num;
    287                 }
    288                 start = end;
    289                 mergeSort(a, start, step);
    290             }else {
    291                 end = a.length;
    292                 //排序算法
    293                 for(int i=start; i<end; i++){
    294                     int index = i;
    295                     for(int j = i+1; j<end; j++){
    296                         if(a[j] < a[index])
    297                             index = j;
    298                     }
    299                     int num = a[i];
    300                     a[i] = a[index];
    301                     a[index] = num;
    302                 }
    303                 
    304                 //解决上述限制条件的缺陷:当step大于a的长度后,就会无限循环的执行else后的语句
    305                 if(step > a.length){
    306                     return a;
    307                 }
    308                 start = 0;
    309                 step = step * 2;
    310                 mergeSort(a, start, step);
    311             }
    312         }
    313         return a;
    314     }
    315     //网上的方法
    316     public static void mergeSort1(int[] numbers, int left, int right) {   
    317         int t = 1;// 每组元素个数   
    318         int size = right - left + 1;   
    319         while (t < size) {   
    320             int s = t;// 本次循环每组元素个数   
    321             t = 2 * s;   
    322             int i = left;   
    323             while (i + (t - 1) < size) {   
    324                 merge(numbers, i, i + (s - 1), i + (t - 1));   
    325                 i += t;   
    326             }   
    327             if (i + (s - 1) < right)   
    328                 merge(numbers, i, i + (s - 1), right);   
    329         }   
    330     }   
    331     private static void merge(int[] data, int p, int q, int r) {   
    332         int[] B = new int[data.length];   
    333         int s = p;   
    334         int t = q + 1;   
    335         int k = p;   
    336         while (s <= q && t <= r) {   
    337             if (data[s] <= data[t]) {   
    338                 B[k] = data[s];   
    339                 s++;   
    340             } else {   
    341                 B[k] = data[t];   
    342                 t++;   
    343             }   
    344             k++;   
    345         }   
    346         if (s == q + 1)   
    347             B[k++] = data[t++];   
    348         else  
    349             B[k++] = data[s++];   
    350         for (int i = p; i <= r; i++)   
    351             data[i] = B[i];   
    352     }
    353     
    354     /**
    355      * 7 基数排序
    356      * 假设一个数组中最大元素的位数是百位
    357      * 那么步骤如下:
    358      * 1)将所有的数的个位数取出,按照个位数进行排序,构成一个序列。
    359      * 2)将新构成的所有的数的十位数取出,按照十位数进行排序,构成一个序列。
    360      * 3)以此类推,一直到百位
    361      * */
    362     public static int[] baseNumSort(int[] array) {
    363         //首先确定排序的趟数;     
    364         int max = array[0];
    365         for (int i = 1; i < array.length; i++) {
    366             if (array[i] > max) {
    367                 max = array[i];
    368             }
    369         }
    370         int time = 0;
    371         //判断位数;     
    372         while (max > 0) {
    373             max /= 10;
    374             time++;
    375         }
    376         //建立10个队列;     
    377         List<ArrayList> queue = new ArrayList<ArrayList>();
    378         for (int i = 0; i < 10; i++) {
    379             ArrayList<Integer> queue1 = new ArrayList<Integer>();
    380             queue.add(queue1);
    381         }
    382         //进行time次分配和收集;     
    383         for (int i = 0; i < time; i++) {
    384             //分配数组元素;     
    385             for (int j = 0; j < array.length; j++) {
    386                 //得到数字的第time+1位数;   
    387                 int x = array[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
    388                 ArrayList<Integer> queue2 = queue.get(x);
    389                 queue2.add(array[j]);
    390                 queue.set(x, queue2);
    391             }
    392             int count = 0;//元素计数器;     
    393             //收集队列元素;     
    394             for (int k = 0; k < 10; k++) {
    395                 while (queue.get(k).size() > 0) {
    396                     ArrayList<Integer> queue3 = queue.get(k);
    397                     array[count] = queue3.get(0);
    398                     queue3.remove(0);
    399                     count++;
    400                 }
    401             }
    402         }
    403         return array;
    404     }
    405 }

     推荐博客链接:http://www.jianshu.com/p/5e171281a387

  • 相关阅读:
    ArcGIS for window mobile 数据打开
    Linux学习拾遗
    ArcEngine 连接sql server sde
    Server Objects Extension(SOE)开发(三)
    Server Objects Extension(SOE)开发(二)
    C# 调用ArcGIS server admin api
    切片文件发布成切片服务
    Printing tools 自定义模板打印的实现
    ubuntu下安装matlab
    修改ubuntu中的gcc和g++版本
  • 原文地址:https://www.cnblogs.com/K-artorias/p/7490608.html
Copyright © 2011-2022 走看看