JAVA資料結構之遞迴

來源:互聯網
上載者:User

 

/*<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 /> 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.