我要記一下: 堆排序 算法時間復雜度O(nlog n) 歸并排序 最好情況下還是在最壞情況下均是O(nlog2n) 快速排序 O(nlog2n),最壞O(n ^2)
其他為 O(n ^2)
1冒泡排序
public class bubbleSort { public static void main(String[] args) { int[] data = {11,2,5,6,7,14};// int[] data = {11,2}; sort(data); for (int i = 0; i < data.length; i++) { System.out.PRintln(data[i]); }} private static void sort(int[] data) { int temp = 0; int size = data.length; for(int i = 0;i < size - 1 ;i++){ for(int j = 0;j<size - 1 - i;j++){ if(data[j]>data[j+1]){ temp = data[j]; data[j] = data[j+1]; data[j+1] = temp; } } } }}堆排序
public class heapsort { public static void main(String[] args) { int[] data = {11,2,5,6,7,14}; sort(data); for (int i = 0; i < data.length; i++) { System.out.println(data[i]); } } private static void sort(int[] data) { //從最后一個節點的父節點開始// buildMaxheap(data,); for(int i = 0;i < data.length-1;i++){ buildMaxheap(data,data.length-1-i); swap(data, 0, data.length-1-i); } } private static void buildMaxheap(int[] data, int lastindex) { //從最后的一個節點判定 for(int i = (lastindex -1 )/2 ;i>=0;i--){ int k = i; while(k*2+1<=lastindex){ //左右節點對比 int biggerIndex = 2 * k +1; if(biggerIndex < lastindex){ if(data[biggerIndex]<data[biggerIndex + 1]){ biggerIndex++; } } if(data[k]<data[biggerIndex]){ //交換他們之間的位置 swap(data, k, biggerIndex); //他的子節點繼續調整堆 k=biggerIndex; }else{ break; } } } } public static void swap(int[] data,int i,int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; }}插入排序
public class insertsort { public static void main(String[] args) { int[] data = {11,2,5,6,7,14};// int[] data = {11,2}; sort(data); for (int i = 0; i < data.length; i++) { System.out.println(data[i]); } } public static void sort(int[] data){ int length = data.length; int index = 0; int temp = 0; for(int i = 0;i < data.length;i++){ temp = data[i]; for(index = i;index>0&&data[index-1]>temp;index--){ data[index] = data[index-1]; } data[index] = temp; } }}歸并排序
public class mergeSort { public static void main(String[] args) { int[] data = {11,2,5,6,7,14};// int[] data = {11,2}; sort(data); for (int i = 0; i < data.length; i++) { System.out.println(data[i]); }} private static void sort(int[] data) { mergesort(data,0,data.length-1); } private static void mergesort(int[] data, int low, int high) { int mid = (low + high )/2; if(low < high){ mergesort(data,low,mid); mergesort(data,mid+1,high); merge(data,low,mid,high); } } public static void merge(int[] nums,int low,int mid,int high) { //做一個數組 int[] temp = new int[high - low +1]; int i = low;//左數組 int j = mid + 1; int k = 0; while(i <= mid&& j <= high){ if(nums[i]<nums[j]){ temp[k++] = nums[i++]; }else{ temp[k++] = nums[j++]; } } while(i <=mid){ temp[k++] = nums[i++]; } // while(j <=high){ temp[k++] = nums[j++]; } for(int k2 = 0;k2 < temp.length;k2++){ nums[k2+low] = temp[k2]; } }}快速排序
public class quicksort { public static void main(String[] args) { int[] data = {11,2,5,6,7,14}; sort(data); for (int i = 0; i < data.length; i++) { System.out.println(data[i]); } } private static void sort(int[] data) { quickSort(data,0,data.length - 1); } private static void quickSort(int[] data , int low ,int high){ if(low < high){ int middle = getMiddle(data, low, high); quickSort(data, low, middle - 1); quickSort(data, middle+1, high); } } public static int getMiddle(int[] data ,int low,int high){ //快速排序 int temp = data[low]; while(low < high){ while(low < high && data[high] > temp){ high--; } data[low] = data[high]; while(low < high&& data[high] < temp){ low++; } data[high] = data[low]; } data[low] = temp; return low; }}選擇排序
public class selectSort { public static void main(String[] args) { int[] data = {11,2,5,6,7,14};// int[] data = {11,2}; sort(data); for (int i = 0; i < data.length; i++) { System.out.println(data[i]); }} private static void sort(int[] data) { int length = data.length; int temp; int index = 0; for(int i = 0 ;i < length;i++){ //標記最小的下標 temp = data[i]; index = i; for(int j = i ; j < length;j++){ //如果比較 if(data[j]<temp){ temp = data[j]; index = j; } } temp = data[index] ; data[index] = data[i]; data[i] = temp; } }}希爾排序
public class shellSort { public static void main(String[] args) { int[] data = {11,2,5,6,7,14};// int[] data = {11,2}; sort(data); for (int i = 0; i < data.length; i++) { System.out.println(data[i]); }} //使用希爾排序 需要用到步長 private static void sort(int[] data) { int index; int temp ; int j;// int increment; //利用步長來判斷 for(int increment = data.length/2;increment > 0;increment/=2){// temp = data[] for (int i = 0; i < data.length; i++) { //取得 temp = data[i]; //對應組來對比 for( j = i ;j >= increment;j-=increment){ if(temp < data[j - increment]){ data[j] = data[j - increment]; }else{ break; } } data[j] = temp; } } }}新聞熱點
疑難解答