Edzy_Java

            BlogJava :: 首頁 ::  ::  ::  :: 管理 ::
            58 隨筆 :: 12 文章 :: 11 評(píng)論 :: 0 Trackbacks
            用Java語言實(shí)現(xiàn)的各種排序,包括插入排序、冒泡排序、選擇排序、Shell排序、快速排序、歸并排序、堆排序、SortUtil等。

            插入排序:

            package org.rut.util.algorithm.support;
            import org.rut.util.algorithm.SortUtil;
            public class InsertSort implements SortUtil.Sort
            {
             public void sort(int[] data)
             {
              int temp;
              for(int i=1;i for(int j=i;(j>0)&&(data[j] SortUtil.swap(data,j,j-1);
             }
            }

            冒泡排序:

            package org.rut.util.algorithm.support;
            import org.rut.util.algorithm.SortUtil;
            public class BubbleSort implements SortUtil.Sort
             public void sort(int[] data)
             {
              int temp;
              for(int i=0;i for(int j=data.length-1;j>i;j--)
              {
               if(data[j] SortUtil.swap(data,j,j-1);
              }
             }
            }

            選擇排序:

            package org.rut.util.algorithm.support;
            import org.rut.util.algorithm.SortUtil;
            public class SelectionSort implements SortUtil.Sort
            {
             public void sort(int[] data)
             {
              int temp;
              for (int i = 0; i < data.length; i++)
              {
               int lowIndex = i;
               for (int j = data.length - 1; j >i; j--)
               {
                if (data[j] < data[lowIndex])
                {
                 lowIndex = j;
                }
               }
               SortUtil.swap(data,i,lowIndex);
              }
             }
            }

          ??????? Shell排序:

            package org.rut.util.algorithm.support;
            import org.rut.util.algorithm.SortUtil;
            public class ShellSort implements SortUtil.Sort
            {
             public void sort(int[] data)
             {
              for(int i=data.length/2;i>2;i/=2)
              {
               for(int j=0;j insertSort(data,j,i);
              }
             }
             insertSort(data,0,1);
            }

            private void insertSort(int[] data, int start, int inc)
            {
             int temp;
             for(int i=start+inc;i for(int j=i;(j>=inc)&&(data[j] SortUtil.swap(data,j,j-inc);
            }

            快速排序:

            package org.rut.util.algorithm.support;
            import org.rut.util.algorithm.SortUtil;
            public class QuickSort implements SortUtil.Sort
            {
             public void sort(int[] data)
             {
              quickSort(data,0,data.length-1);
             }
             private void quickSort(int[] data,int i,int j)
             {
              int pivotIndex=(i+j)/2;
              //swap
              SortUtil.swap(data,pivotIndex,j);
              int k=partition(data,i-1,j,data[j]);
              SortUtil.swap(data,k,j);
              if((k-i)>1) quickSort(data,i,k-1);
              if((j-k)>1) quickSort(data,k+1,j);
             }
             private int partition(int[] data, int l, int r,int pivot)
             {
              do
              {
               while(data[++l] while((r!=0)&&data[--r]>pivot);
               SortUtil.swap(data,l,r);
              }
              while(l SortUtil.swap(data,l,r);
              return l;
             }
            }

            改進(jìn)后的快速排序:

            package org.rut.util.algorithm.support;
            import org.rut.util.algorithm.SortUtil;
            public class ImprovedQuickSort implements SortUtil.Sort
            {
             private static int MAX_STACK_SIZE=4096;
             private static int THRESHOLD=10;
             public void sort(int[] data)
             {
              int[] stack=new int[MAX_STACK_SIZE];
              int top=-1;
              int pivot;
              int pivotIndex,l,r;
              stack[++top]=0;
              stack[++top]=data.length-1;
              while(top>0)
              {
               int j=stack[top--];
               int i=stack[top--];
               pivotIndex=(i+j)/2;
               pivot=data[pivotIndex];
               SortUtil.swap(data,pivotIndex,j);
               //partition
               l=i-1;
               r=j;
               do
               {
                while(data[++l] while((r!=0)&&(data[--r]>pivot));
                SortUtil.swap(data,l,r);
               }
               while(l SortUtil.swap(data,l,r);
               SortUtil.swap(data,l,j);
               if((l-i)>THRESHOLD)
               {
                stack[++top]=i;
                stack[++top]=l-1;
               }
               if((j-l)>THRESHOLD)
               {
                stack[++top]=l+1;
                stack[++top]=j;
               }
              }
              //new InsertSort().sort(data);
              insertSort(data);
             }
             private void insertSort(int[] data)
             {
              int temp;
              for(int i=1;i for(int j=i;(j>0)&&(data[j] SortUtil.swap(data,j,j-1);
             }
            }

            歸并排序:

            package org.rut.util.algorithm.support;
            import org.rut.util.algorithm.SortUtil;
            public class MergeSort implements SortUtil.Sort
            {
             public void sort(int[] data)
             {
              int[] temp=new int[data.length];
              mergeSort(data,temp,0,data.length-1);
             }
             private void mergeSort(int[] data,int[] temp,int l,int r)
             {
              int mid=(l+r)/2;
              if(l==r) return ;
              mergeSort(data,temp,l,mid);
              mergeSort(data,temp,mid+1,r);
              for(int i=l;i<=r;i++){
              temp[i]=data[i];
             }
             int i1=l;
             int i2=mid+1;
             for(int cur=l;cur<=r;cur++)
             {
              if(i1==mid+1)
              data[cur]=temp[i2++];
              else if(i2>r)
              data[cur]=temp[i1++];
              else if(temp[i1] data[cur]=temp[i1++];
              else
              data[cur]=temp[i2++];
             }
            }
           
            改進(jìn)后的歸并排序:

            package org.rut.util.algorithm.support;
            import org.rut.util.algorithm.SortUtil;
            public class ImprovedMergeSort implements SortUtil.Sort
            {
             private static final int THRESHOLD = 10;
             public void sort(int[] data)
             {
              int[] temp=new int[data.length];
              mergeSort(data,temp,0,data.length-1);
             }
             private void mergeSort(int[] data, int[] temp, int l, int r)
             {
              int i, j, k;
              int mid = (l + r) / 2;
              if (l == r)
              return;
              if ((mid - l) >= THRESHOLD)
              mergeSort(data, temp, l, mid);
              else
              insertSort(data, l, mid - l + 1);
              if ((r - mid) >THRESHOLD)
              mergeSort(data, temp, mid + 1, r);
              else
              insertSort(data, mid + 1, r - mid);
              for (i = l; i <= mid; i++)
              {
               temp[i] = data[i];
              }
              for (j = 1; j <= r - mid; j++)
              {
               temp[r - j + 1] = data[j + mid];
              }
              int a = temp[l];
              int b = temp[r];
              for (i = l, j = r, k = l; k <= r; k++)
              {
               if (a < b)
               {
                data[k] = temp[i++];
                a = temp[i];
               }
               else
               {
                data[k] = temp[j--];
                b = temp[j];
               }
              }
             }

             private void insertSort(int[] data, int start, int len)
             {
              for(int i=start+1;i for(int j=i;(j>start) && data[j] SortUtil.swap(data,j,j-1);
             }
            }

            堆排序:

            package org.rut.util.algorithm.support;
            import org.rut.util.algorithm.SortUtil;
            public class HeapSort implements SortUtil.Sort
            {
             public void sort(int[] data)
             {
              MaxHeap h=new MaxHeap();
              h.init(data);
              for(int i=0;i h.remove();
              System.arraycopy(h.queue,1,data,0,data.length);
             }
             private static class MaxHeap
             {
              void init(int[] data)
              {
               this.queue=new int[data.length+1];
               for(int i=0;i queue[++size]=data[i];
               fixUp(size);
              }
             }
             private int size=0;
             private int[] queue;
             public int get()
             {
              return queue[1];
             }
             public void remove()
             {
              SortUtil.swap(queue,1,size--);
              fixDown(1);
             }
             //fixdown
             private void fixDown(int k)
             {
              int j;
              while ((j = k << 1) <= size)
              {
               if (j < size && queue[j] j++;
               if (queue[k]>queue[j]) //不用交換
               break;
               SortUtil.swap(queue,j,k);
               k = j;
              }
             }
             private void fixUp(int k)
             {
              while (k >1)
              {
               int j = k >>1;
               if (queue[j]>queue[k])
               break;
               SortUtil.swap(queue,j,k);
               k = j;
              }
             }
            }

            SortUtil:

            package org.rut.util.algorithm;
            import org.rut.util.algorithm.support.BubbleSort;
            import org.rut.util.algorithm.support.HeapSort;
            import org.rut.util.algorithm.support.ImprovedMergeSort;
            import org.rut.util.algorithm.support.ImprovedQuickSort;
            import org.rut.util.algorithm.support.InsertSort;
            import org.rut.util.algorithm.support.MergeSort;
            import org.rut.util.algorithm.support.QuickSort;
            import org.rut.util.algorithm.support.SelectionSort;
            import org.rut.util.algorithm.support.ShellSort;

            public class SortUtil
            {
             public final static int INSERT = 1;
             public final static int BUBBLE = 2;
             public final static int SELECTION = 3;
             public final static int SHELL = 4;
             public final static int QUICK = 5;
             public final static int IMPROVED_QUICK = 6;
             public final static int MERGE = 7;
             public final static int IMPROVED_MERGE = 8;
             public final static int HEAP = 9;
             public static void sort(int[] data)
             {
              sort(data, IMPROVED_QUICK);
             }
             private static String[] name=
             {
              "insert", "bubble", "selection", "shell", "quick", "improved_quick", "merge", "improved_merge", "heap"
             };
             private static Sort[] impl=new Sort[]
             {
              new InsertSort(),
              new BubbleSort(),
              new SelectionSort(),
              new ShellSort(),
              new QuickSort(),
              new ImprovedQuickSort(),
              new MergeSort(),
              new ImprovedMergeSort(),
              new HeapSort()
             };
             public static String toString(int algorithm)
             {
              return name[algorithm-1];
             }
             public static void sort(int[] data, int algorithm)
             {
              impl[algorithm-1].sort(data);
             }
             public static interface Sort
             {
              public void sort(int[] data);
             }
             public static void swap(int[] data, int i, int j)
             {
              int temp = data[i];
              data[i] = data[j];
              data[j] = temp;
             }
            }
          posted on 2007-03-14 11:16 lbfeng 閱讀(244) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE技術(shù)雜談

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 永福县| 乌鲁木齐市| 突泉县| 虎林市| 万宁市| 庆城县| 诸暨市| 万盛区| 乐至县| 石棉县| 云浮市| 忻城县| 寿光市| 邹平县| 将乐县| 固阳县| 秀山| 冷水江市| 黑龙江省| 阿合奇县| 定安县| 舒兰市| 洛隆县| 长宁区| 贡觉县| 寿阳县| 浏阳市| 石嘴山市| 九江市| 华阴市| 镇赉县| 常德市| 榆林市| 芷江| 彩票| 乌鲁木齐县| 星座| 彰化县| 巴彦县| 尚义县| 武川县|