/*<br />折半尋找(二分尋找)的遞迴和非遞迴演算法<br />*/<br />public class BinarySearch<T extends Comparable<T>><br />{<br />private T[] data;<br />public BinarySearch(T[] data)<br />{<br />this.data = data;<br />}<br />public int search(T key)<br />{<br />int low;<br />int high;<br />int mid;<br />if(data == null)<br />return -1;<br />low = 0;<br />high = data.length - 1;<br />while(low <= high)<br />{<br />mid = (low + high) / 2;<br />System.out.println("mid " + mid + "mid value:" + data[mid]);<br />if(key.compareTo(data[mid]) < 0)<br />{<br />high = mid - 1;<br />}<br />else if(key.compareTo(data[mid]) > 0)<br />{<br />low = mid + 1;<br />}<br />else if(key.compareTo(data[mid]) == 0)<br />{<br />return mid;<br />}<br />}<br />return -1;<br />}<br />private int doSearchRecursively(int low,int high,T key)<br />{<br />int mid;<br />int result;<br />if(low <= high)<br />{<br />mid = (low + high) / 2;<br />result = key.compareTo(data[mid]);<br />System.out.println("mid " + mid + " mid value:" + data[mid]);<br />if(result < 0)<br />{<br />return doSearchRecursively(low,mid - 1,key);<br />}<br />else if(result > 0)<br />{<br />return doSearchRecursively(mid+1,high,key);<br />}else if(result == 0)<br />{<br />return mid;<br />}<br />}<br />return -1;<br />}<br />public int searchRecursively(T key)<br />{<br />if(data == null) return -1;<br />return doSearchRecursively(0,data.length - 1,key);<br />}<br />public static void main(String[] args)<br />{<br />Integer []data = {1,4,5,8,15,33,48,77,96};<br />//BinarySearch<Integer> binSearch = new BinarySearch<Integer>(data);<br />//System.out.println("Key index:" + binSearch.searchRecursively(3));<br />//System.out.println("Key index:" + binSearch.search(33));<br />//String []dataStr = {"A","C","F","J","L","N","T"};<br />//BinarySearch<String> binSearch = new BinarySearch<String>(dataStr);<br />//System.out.println("Key index:"+binSearch.search("F"));<br />}<br />}
<br />public class Test1<br />{<br />public static void main(String []args)<br />{<br />int t[] = {1,2,4,3};<br />range(t,0);<br />}<br />public static void range(int []a,int start)<br />{<br />if(start == a.length)<br />{<br />for(int i =0;i<a.length;i++)<br />{<br />System.out.print(a[i]);<br />}<br />System.out.println();<br />return;<br />}<br />for(int i = start;i<a.length;i++)<br />{<br />int temp = a[start];<br />a[start] = a[i];<br />a[i] = temp;<br />range(a,start+1);<br />a[i] = a[start];<br />a[start] = temp;<br />}<br />}<br />}
public class Test2<br />{<br />public static void main(String args[])<br />{<br />int t[] = {1,2,4,3};<br />range(t,0);<br />}<br />public static void range(int[] a,int start)<br />{<br />if(start == a.length)<br />{<br />for(int i=0;i<a.length;i++)<br />{<br />System.out.print(a[i]);<br />}<br />System.out.println();<br />return;<br />}<br />int dest[] = new int[a.length];<br />System.arraycopy(a,0,dest,0,a.length);<br />for(int i = start;i<a.length;i++)<br />{<br />int temp = dest[start];<br />dest[start] = dest[i];<br />dest[i] = temp;<br />range(dest,start + 1);<br />}<br />}<br />}
public class Test3<br />{<br />public static void main(String args[])<br />{<br />int t[] = {1,2,3,4};<br />range(t,0);<br />}<br />public static void range(int[] a,int start)<br />{<br />if(start == a.length)<br />{<br />for(int i=0;i<a.length;i++)<br />{<br />System.out.print(a[i]);<br />}<br />System.out.println();<br />return;<br />}<br />for(int i = start;i<a.length;i++)<br />{<br />int dest[] = new int[a.length];<br />System.arraycopy(a,0,dest,0,a.length);<br />int temp = dest[start];<br />dest[start] = dest[i];<br />dest[i] = temp;<br />range(dest,start + 1);<br />}<br />}<br />}
<br />public class ArraySh<br />{<br />int []theArray;<br />int nElems;<br />int count = 0;<br />ArraySh(int max)<br />{<br />theArray = new int[max];<br />nElems = max;<br />}<br />public static void main(String[] args)<br />{<br />int maxSize = 16;<br />ArraySh arr;<br />arr = new ArraySh(maxSize);<br />for(int j=0;j<maxSize;j++)<br />{<br />int n = (int)(java.lang.Math.random() * 99);<br />arr.insert(n);<br />}<br />arr.display();<br />arr.quickSort();<br />arr.display();<br />}<br />public void insert(int i)<br />{<br />theArray[count++] = i;<br />}<br />public void display()<br />{<br />for(int i : theArray)<br />{<br />System.out.print(i+" ");<br />}<br />System.out.println();<br />}<br />public void quickSort()<br />{<br />recQuickSort(0,nElems - 1);<br />}<br />public void recQuickSort(int left,int right)<br />{<br />if(right - left <= 0)<br />return;<br />else<br />{<br />long pivot = theArray[right];<br />int partition = partitionIt(left,right,pivot);<br />recQuickSort(left,partition-1);<br />recQuickSort(partition+1,right);<br />}<br />}<br />public int partitionIt(int left,int right,long pivot)<br />{<br />int leftPtr = left - 1;<br />int rightPtr = right;<br />while(true)<br />{<br />while(theArray[++leftPtr] < pivot);<br />while(rightPtr > 0 && theArray[--rightPtr] > pivot);<br />if(leftPtr >= rightPtr)break;<br />else<br />swap(leftPtr,rightPtr);<br />}<br />swap(leftPtr,right);<br />return leftPtr;<br />}<br />public void swap(int dex1,int dex2)<br />{<br />int temp = theArray[dex1];<br />theArray[dex1] = theArray[dex2];<br />theArray[dex2] = temp;<br />}<br />}
//package sort;<br />import java.util.Date;<br />import java.util.Random;<br />/*<br /> * 插入排序<br /> */<br />public class InsertSort<br />{<br />public static void main(String args[])<br />{<br />int len = 20;<br />Date date = new Date();<br />Random random = new Random(date.getSeconds());<br />int data[]=new int[len];<br />for(int i = 0; i < len; i++)<br />{<br />data[i]=(int)(random.nextFloat()*100+1);<br />}<br />show(data);<br />insertSort(data,data.length);<br />show(data);<br />System.out.println(binarySearch(data,1,data.length,55));<br />System.out.println(binarySearch2(data,55));<br />insertSortDesc(data);<br />show(data);<br />System.out.println(binarySearch(data,1,data.length,55));<br />System.out.println(binarySearch2(data,55));<br />}<br />/*<br /> * 插入排序核心<br /> */<br />private static void insertSortDesc(int[] data)<br />{<br />int length = data.length;<br />for(int i = 1; i < length; i++)<br />{<br />int temp = data[i];<br />int j = i-1;<br />while(j >= 0 && data[j] < temp)<br />{<br />data[j+1] = data[j];<br />j--;<br />}<br />data[j+1] = temp;<br />}<br />}<br />private static void insertSortAsc(int[] data)<br />{<br />int length = data.length;<br />for(int i = 1; i < length; i++)<br />{<br />int temp = data[i];<br />int j = i-1;<br />while(j >= 0 && data[j] > temp)<br />{<br />data[j+1] = data[j];<br />j--;<br />}<br />data[j+1] = temp;<br />}<br />}<br />private static void show(int[] data)<br />{<br />System.out.println("========================");<br />for(int i = 0; i < data.length; i++)<br />{<br />System.out.print(data[i] + " ");<br />}<br />System.out.println();<br />System.out.println("========================");<br />}<br />/*<br /> * 使用遞迴實現的插入排序演算法<br /> */<br />private static void insertSort(int[] data,int n)<br />{<br />if(n>1)<br />{<br />insertSort(data,n-1);<br />merge(data,n-1,n);<br />}<br />}<br />private static void merge(int[] data,int end,int n)<br />{<br />int temp=data[n-1];<br />int i;<br />for( i=end-1; i>=0; i--)<br />{<br />if(data[i]>temp)<br />data[i+1]=data[i];<br />else<br />break;<br />}<br />data[i+1]=temp;<br />}<br />/*<br /> * 遞迴版的二分尋找演算法,只能是按照升序排列的數組<br /> */<br />private static int binarySearch(int[] data,int start,int end,int value)<br />{<br />if(end>=start)<br />{<br />int pos=(start+end)/2;<br />if(value==data[pos-1])<br />return pos;<br />else if(value>data[pos-1])<br />return binarySearch(data,pos+1,end,value);<br />else<br />return binarySearch(data,start,pos-1,value);<br />}<br />return -1;<br />}</p><p>/*<br /> * 迭代版二分尋找演算法,只能尋找按照升序排列的數組<br /> */<br />private static int binarySearch2(int[] data,int value)<br />{<br />int start = 0 ;<br />int end = data.length-1;<br />int mid;<br />while(end>=start)<br />{<br />mid=(end+start)/2;<br />if(value>data[mid])<br />start=mid+1;<br />else if(value<data[mid])<br />end=mid-1;<br />else<br />return mid+1;<br />}<br />return -1;<br />}<br />}<br />