用JAVA实现的9种排序算法(二)
来源:互联网 发布:java面试常用设计模式 编辑:程序博客网 时间:2024/05/16 18:19
- 5.Shell排序
- package com.javasort.shellsorter;
-
-
-
-
-
-
-
-
-
-
-
-
-
- import com.javasort.Sorter;
-
-
-
-
-
-
-
- public class ShellSorter<E extends Comparable<E>> extends Sorter<E> {
-
- @Override
- public void sort(E[] array, int from, int len) {
-
- int value=1;
- while((value+1)*2<len){
- value=(value+1)*2-1;
- }
-
- for(int delta=value;delta>=1;delta=(delta+1)/2-1){
- for(int i=0;i<delta;i++){
- modify_insert_sort(array,from+i,len-i,delta);
- }
-
- }
- }
-
- private final void modify_insert_sort(E[] array, int from, int len, int delta) {
- if(len<=1)
- return;
- E tmp=null;
- for(int i=from+delta;i<from+len;i+=delta){
- tmp=array[i];
- int j=i;
- for(;j>from;j-=delta){
- if(tmp.compareTo(array[j-delta])<0){
- array[j]=array[j-delta];
- }
- else break;
- }
- array[j]=tmp;
- }
-
- }
-
- }
-
- package com.javasort.shellsorter;
-
- import com.javasort.Sorter;
-
- public class ShellSorterTest {
-
- public static void main(String[] args) {
- Comparable[] array={5,1,13,2,17,9,7,4,0};
- Sorter shellSorter=new ShellSorter();
- shellSorter.sort(array);
- shellSorter.printResult(array);
- }
-
- }
-
- 6.堆排序
- package com.javasort.heapsorter;
-
-
-
-
-
-
-
-
-
-
-
- import com.javasort.Sorter;
-
-
-
-
-
-
- public class HeapSorter<E extends Comparable<E>> extends Sorter<E> {
-
- @Override
- public void sort(E[] array, int from, int len) {
- build_heap(array,from,len);
- for(int i=0;i<len;i++){
-
- swap(array, from, from+len-1-i);
-
- shift_down(array, from, len-1-i, 0);
- }
- }
-
- private final void build_heap(E[] array, int from, int len) {
-
- int pos=(len-1)/2;
- for(int i=pos;i>=0;i--){
- shift_down(array,from,len,i);
- }
-
- }
-
- private final void shift_down(E[] array, int from, int len, int pos) {
- E tmp=array[from+pos];
- int index=pos*2+1;
- while(index<len)
- {
- if(index+1<len&&array[from+index].compareTo(array[from+index+1])<0)
- {
- index+=1;
- }
- if(tmp.compareTo(array[from+index])<0){
- array[from+pos]=array[from+index];
- pos=index;
- index=pos*2+1;
-
- }
- else{
- break;
- }
- }
- array[from+pos]=tmp;
- }
-
- }
-
-
-
-
- package com.javasort.heapsorter;
-
- import com.javasort.Sorter;
-
-
-
-
-
- public class HeapSorterTest {
-
- public static void main(String[] args) {
- Comparable[] array = { 5, 1, 13, 2, 17, 9, 7, 4, 0 };
- Sorter heapSorter=new HeapSorter();
- heapSorter.sort(array);
- heapSorter.printResult(array);
- }
-
- }
-
- 7.桶式排序
-
-
-
-
-
-
-
-
-
-
-
-
- package com.javasort.bucketsorter;
-
-
-
-
-
- public class BucketSorter {
- public void sort(int[] keys,int from,int len,int max)
- {
- int[] temp=new int[len];
- int[] count=new int[max];
-
-
- for(int i=0;i<len;i++)
- {
- count[keys[from+i]]++;
- }
-
- for(int i=1;i<max;i++)
- {
- count[i]=count[i]+count[i-1];
- }
-
- System.arraycopy(keys, from, temp, 0, len);
- for(int k=len-1;k>=0;k--)
- {
- keys[--count[temp[k]]]=temp[k];
- }
- }
-
-
-
- public static void main(String[] args) {
-
- int[] a={1,4,8,3,2,9,5,0,7,6,9,10,9,13,14,15,11,12,17,16};
- BucketSorter bucketSorter=new BucketSorter();
- bucketSorter.sort(a,0,a.length,20);
-
-
- for(int i=0;i<a.length;i++)
- {
- System.out.print(a[i]+",");
- }
-
- }
-
-
- }
-
- 8.基数排序
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- package com.javasort.radixsorter;
-
- import java.util.Arrays;
-
-
-
-
-
- public class RadixSorter {
- public static boolean USE_LINK=true;
-
-
-
-
-
-
-
-
-
- public void sort(int[] keys,int from ,int len,int radix, int d)
- {
- if(USE_LINK)
- {
- link_radix_sort(keys,from,len,radix,d);
- }
- else
- {
- array_radix_sort(keys,from,len,radix,d);
- }
-
- }
-
-
- private final void array_radix_sort(int[] keys, int from, int len, int radix,
- int d)
- {
- int[] temporary=new int[len];
- int[] count=new int[radix];
- int R=1;
-
- for(int i=0;i<d;i++)
- {
- System.arraycopy(keys, from, temporary, 0, len);
- Arrays.fill(count, 0);
- for(int k=0;k<len;k++)
- {
- int subkey=(temporary[k]/R)%radix;
- count[subkey]++;
- }
- for(int j=1;j<radix;j++)
- {
- count[j]=count[j]+count[j-1];
- }
- for(int m=len-1;m>=0;m--)
- {
- int subkey=(temporary[m]/R)%radix;
- --count[subkey];
- keys[from+count[subkey]]=temporary[m];
- }
- R*=radix;
- }
-
- }
-
-
- private static class LinkQueue
- {
- int head=-1;
- int tail=-1;
- }
- private final void link_radix_sort(int[] keys, int from, int len, int radix, int d) {
-
- int[] nexts=new int[len];
-
- LinkQueue[] queues=new LinkQueue[radix];
- for(int i=0;i<radix;i++)
- {
- queues[i]=new LinkQueue();
- }
- for(int i=0;i<len-1;i++)
- {
- nexts[i]=i+1;
- }
- nexts[len-1]=-1;
-
- int first=0;
- for(int i=0;i<d;i++)
- {
- link_radix_sort_distribute(keys,from,len,radix,i,nexts,queues,first);
- first=link_radix_sort_collect(keys,from,len,radix,i,nexts,queues);
- }
- int[] tmps=new int[len];
- int k=0;
- while(first!=-1)
- {
-
- tmps[k++]=keys[from+first];
- first=nexts[first];
- }
- System.arraycopy(tmps, 0, keys, from, len);
-
-
- }
- private final void link_radix_sort_distribute(int[] keys, int from, int len,
- int radix, int d, int[] nexts, LinkQueue[] queues,int first) {
-
- for(int i=0;i<radix;i++)queues[i].head=queues[i].tail=-1;
- while(first!=-1)
- {
- int val=keys[from+first];
- for(int j=0;j<d;j++)val/=radix;
- val=val%radix;
- if(queues[val].head==-1)
- {
- queues[val].head=first;
- }
- else
- {
- nexts[queues[val].tail]=first;
-
- }
- queues[val].tail=first;
- first=nexts[first];
- }
-
- }
- private int link_radix_sort_collect(int[] keys, int from, int len,
- int radix, int d, int[] nexts, LinkQueue[] queues) {
- int first=0;
- int last=0;
- int fromQueue=0;
- for(;(fromQueue<radix-1)&&(queues[fromQueue].head==-1);fromQueue++);
- first=queues[fromQueue].head;
- last=queues[fromQueue].tail;
-
- while(fromQueue<radix-1&&queues[fromQueue].head!=-1)
- {
- fromQueue+=1;
- for(;(fromQueue<radix-1)&&(queues[fromQueue].head==-1);fromQueue++);
-
- nexts[last]=queues[fromQueue].head;
- last=queues[fromQueue].tail;
-
- }
- if(last!=-1)nexts[last]=-1;
- return first;
- }
-
- public static void main(String[] args) {
- int[] a={1,4,8,3,2,9,5,0,7,6,9,10,9,135,14,15,11,33,999999999,222222222,1111111111,12,17,45,16};
- USE_LINK=true;
- RadixSorter sorter=new RadixSorter();
- sorter.sort(a,0,a.length,10,10);
- for(int i=0;i<a.length;i++)
- {
- System.out.print(a[i]+",");
- }
-
-
- }
-
-
- }
-
-
- 9.归并排序
- package com.javasort.mergesorter;
-
-
-
-
-
-
- import java.lang.reflect.Array;
-
- import com.javasort.Sorter;
-
-
-
-
-
-
- public class MergeSorter<E extends Comparable<E>> extends Sorter<E> {
-
- @SuppressWarnings("unchecked")
- @Override
- public void sort(E[] array, int from, int len) {
- if (len <= 1)
- return;
- E[] temporary = (E[]) Array.newInstance(array[0].getClass(), len);
- merge_sort(array, from, from + len - 1, temporary);
- }
-
- private final void merge_sort(E[] array, int from, int to, E[] temporary) {
- if (to <= from) {
- return;
- }
- int middle = (from + to) / 2;
- merge_sort(array, from, middle, temporary);
- merge_sort(array, middle + 1, to, temporary);
- merge(array, from, to, middle, temporary);
- }
-
- private final void merge(E[] array, int from, int to, int middle,
- E[] temporary) {
- int k = 0, leftIndex = 0, rightIndex = to - from;
- System.arraycopy(array, from, temporary, 0, middle - from + 1);
- for (int i = 0; i < to - middle; i++) {
- temporary[to - from - i] = array[middle + i + 1];
- }
- while (k < to - from + 1) {
- if (temporary[leftIndex].compareTo(temporary[rightIndex]) < 0) {
- array[k + from] = temporary[leftIndex++];
- } else {
- array[k + from] = temporary[rightIndex--];
- }
- k++;
- }
- }
-
- }
-
-
-
-
-
- package com.javasort.mergesorter;
-
- import com.javasort.Sorter;
-
-
-
-
-
- public class MergeSorterTest {
- public static void main(String[] args) {
- Comparable[] array = { 5, 1, 13, 2, 17, 9, 7, 4, 0 };
- Sorter mergeSorter = new MergeSorter();
- mergeSorter.sort(array);
- mergeSorter.printResult(array);
- }
-
- }