本文章代碼來自於項目:http://git.oschina.net/jiangkun/Introduction_to_Algorithms-Third_Edition-Answersjava
歡迎你們一塊兒參與!我會不定時更新!c++
package acm; import java.util.Arrays; public class SortAlgorithms { //插入排序 public static void InsertionSort(int[] arr) { int len = arr.length; int i,j; int key; for(j=1;j<len;j++) { key = arr[j]; i=j-1; while(i>=0 && arr[i]>key) { arr[i+1]=arr[i]; i--; } arr[i+1]=key; } } //選擇排序 public static void SelectionSort(int[] arr) { int len = arr.length; int min; for(int i=0; i<len-1; i++) { min=arr[i]; for(int j=i+1; j<len; j++) { if(arr[j]<arr[min]) { min = j; } } if(min!=i) { int t=arr[min]; arr[min]=arr[i]; arr[i]=t; } } } //歸併排序 public static int[] MergeSort(int arrs[]) { if(arrs.length < 2) return arrs; int middle = arrs.length/2; int[] left = Arrays.copyOfRange(arrs, 0, middle); int[] right = Arrays.copyOfRange(arrs, middle, arrs.length); int[] lres = MergeSort(left); int[] rres = MergeSort(right); return merge(lres, rres); } private static int[] merge(int[] lres, int[] rres) { int[] res = new int[lres.length+rres.length]; int l=0; int r=0; int c=0; while(l<lres.length && r<rres.length) { if(lres[l]<rres[r]) res[c++]=lres[l++]; else res[c++]=rres[r++]; } if(l==lres.length) { while(r<rres.length) res[c++]=rres[r++]; return res; } if(r==rres.length) { while(l<lres.length) res[c++]=lres[l++]; return res; } return res; } //冒泡排序 public static void BubbleSort(int arr[]) { for(int i=0;i<arr.length;i++) { for(int j=arr.length-1; j>i; j--) { if(arr[j]<arr[j-1]) { int t=arr[j]; arr[j]=arr[j-1]; arr[j-1]=t; } } } } //堆排序 public static void heapSort(int[] arr) { int hLen = arr.length; int temp; buildMaxHeap(arr); while(hLen>1) { temp=arr[hLen-1]; arr[hLen-1]=arr[0]; arr[0]=temp; hLen--; max_heapify(arr, hLen, 0); } } private static void buildMaxHeap(int[] arr) //從無序數組中構造一個最大堆, n*lgn { int hLen = arr.length; int begin= hLen/2-1; for(int i=begin;i>=0;i--) { max_heapify(arr,hLen, i); } } private static void max_heapify(int[] arr, int hLen, int i) //用於調整堆,維護最大堆的性質,lgn { int left = 2*i+1; //i的左孩子,由於數組中下標是從0開始的 int right =2*i+2; //i的右孩子,由於數組中下標是從0開始的 int largest=i; if(left<hLen && arr[left]>arr[i]) { largest = left; } if(right<hLen && arr[right]>arr[largest]) { largest = right; } if(i!=largest) { int temp=arr[largest]; arr[largest]=arr[i]; arr[i]=temp; max_heapify(arr, hLen, largest); } } }