排序算法是最基本、最常见的一类算法。也是IT大公司常考的题目,这里花了一个晚上的时间总结了下,并都通过eclipse实现通过。关于各种算法的在哪些场合和改进之处,求各位大神赐教。

冒泡算法:冒泡算法的思路就是交换排序,通过相邻数据的交换达到排序的目的。平均速度为o(n2).

public class BubbleSort {
   static final int SIZE=10;
   public static void BubbleSort(int[] a){
       int temp,i;
       for(i=1;i<a.length;i++){
           for(int j=0;j<a.length-i;j++){
               if(a[j]>a[j+1]){
                 temp=a[j];
                 a[j]=a[j+1];
                 a[j+1]=temp;
               }
           }
       System.out.print("第"+i+"步的排序结果:");
       for(int k=0;k<a.length;k++){
           System.out.print(" "+a[k]);
       }
       System.out.print("\n");
       }
   }

选择排序:选择排序在每一步选取最小的值来重新排列。平均速度为o(nlogn)。

class SelectSort{ 
        private int index;
        private int temp;
        public void selectSort(int[] a){
            for(int i=0;i<a.length-1;i++){
                index=i;
                for(int j=i+1;j<a.length;j++){
                    if(a[j]<a[index]){
                        index=j;//始终保持index代表最小值的索引
                    }
                }
                //交换当前比较的位置和最小索引的值
                if(i!=index){
                    temp=a[i];
                    a[i]=a[index];
                    a[index]=temp;
                }
                System.out.print("第"+(i+1)+"步的排序结果:");//输出每步结果便于观察
                for(int j=0;j<a.length;j++){
                    System.out.print(" "+a[j]);
                }
                System.out.print("\n");
            }
        }

插入排序:通过对未进行排序的数逐行插入到合适的位置。平均速度o(n2)。

public class InsertSort {
    static final int NUM_SIZE=10;
    private int j,t;
    public void insertSort(int[] a){
     for(int i=1;i<a.length;i++){
         t=a[i];      //t保存的是待插入的元素
         j=i-1;      //j是需要插入的位置
         while(j>=0&&t<a[j]){
            a[j+1]=a[j];
            j--;
         }         //通过while循环找到在t位置之前比t小的元素a[j],比t大的元素往后移
         a[j+1]=t; //在j的后一位插入待插元素t
         System.out.print("第"+(i)+"步的排序结果:");//输出每步结果便于观察
            for(int j=0;j<a.length;j++){
                System.out.print(" "+a[j]);
            }
            System.out.print("\n");
     }
    }

Shell排序:基于插入排序的思想。平均速度为o(n3/2)。

public class ShellSort {
    static final int NUM_SIZE=10;
    private int r,j,t;
    public void insertSort(int[] a){
        int x=0;
        for(r=a.length/2;r>=1;r/=2){ //分组排序
        for(int i=r;i<a.length;i++){
         t=a[i];      //t保存的是待插入的元素
         j=i-r;      //j是需要插入的位置
         while(j>=0&&t<a[j]){
            a[j+r]=a[j];
            j-=r;
         }         //通过while循环找到在t位置之前比t小的元素a[j],比t大的元素往后移r位
         a[j+r]=t; //在j的后r位插入待插元素t
     }            //Shell排序是在插入排序的基础上将距离由1增加到r;在各个的r个距离里实现插入排序,因此移动的数据少,效率高
         x++;
         System.out.print("第"+x+"步的排序结果:");//输出每步结果便于观察
            for(int j=0;j<a.length;j++){
                System.out.print(" "+a[j]);
            }
            System.out.print("\n");
     }
    }

快速排序:快速排序也是基于交换思想,是冒泡排序的改进。平均速度为o(nlogn)。

public class QuickSort {
  static final int NUM_SIZE=10;
  public void quickSort(int[] arr,int left,int right){
      int f,t;
      int ltemp,rtemp;
      ltemp=left;
      rtemp=right;
      f=arr[(left+right)/2];
      while(ltemp<rtemp){
          while(arr[ltemp]<f){
              ++ltemp;
          }
          while(arr[rtemp]>f){
              --rtemp;
          }
          if(ltemp<=rtemp){
              t=arr[ltemp];
              arr[rtemp]=arr[ltemp];
              arr[rtemp]=t;
              --rtemp;
              ++ltemp;
          }
      }
      if(ltemp==rtemp){
          ltemp++;
      }
      if(left<rtemp){
          quickSort(arr,left,ltemp-1);
      }
      if(ltemp<right){
          quickSort(arr,rtemp+1,right);
      }
  }
}

堆排序:其利用二叉树的一些性质和堆的数据结构完成数据的排序。

归并排序:将多个有序链表合并成一个有序的数据表。如果参与排序的只有两个有序链表,则称为二路合并。

 

桶式排序:桶式排序是一种很巧妙的排序方式,在有限制的数据范围内效率很高,能达到o(n)的时间复杂度,不过他的空间开销比较大,数据必须在一定范围内。

代码后续补充。