一. 前期准备
1. 利用java.lang.Math.random()生成数据
public int[] getRandomList_one(int n) { int[] data = new int[n]; for( int i=0 ; i<10 ; i++ ) { data[i] = (int)(Math.random()*100); } return data; }
2. 利用java.util.Random生成数据
import java.util.Random; public int[] getRandomList_two(int n) { int[] data = new int[n]; Random r = new Random(); for( int i=0 ; i<10 ; i++ ) { data[i] = r.nextInt()%100; } return data; }
3. 打印数据
#数据从0开始
public void printListData(int[] data) { for(int d : data) System.out.print(d+" "); System.out.println(); }
#数据从1开始
public void printListData_other(int[] data) { boolean signal = false; for(int d : data) { if(signal == false){ signal = true; continue; } System.out.print(d+" "); } System.out.println(); }
二.算法代码
1. 插入排序
1.1 直接插入排序
public void InsertSort(int[] data) { int len = data.length; for(int i=1;i<len;i++) { if(data[i] > data[i-1]) continue; for(int j=i;j>0;j--) { if(data[j] < data[j-1]) { int tmp = data[j]; data[j] = data[j-1]; data[j-1] = tmp; } } } printListData(data); }
1.2 折半插入排序
public void InsertSort_other(int[] data) { int len = data.length; for(int i=2;i<len;i++) { if(data[i]<data[i-1]) { data[0] = data[i]; int j = i-1; do { data[j+1] = data[j]; j--; }while(data[j]>data[0]); data[j+1] = data[0]; } } printListData_other(data); }
1.3 希尔排序
public void HashSort(int[] data) { int len = data.length; for( int step = len/2; step>0; step/=2 ) { for(int i = step; i < len; i++) { for(int j = i ; j - step >= 0; j = j - step) { if(data[j-step] > data[j]) { int tmp = data[j-step]; data[j-step] = data[j]; data[j] = tmp; } } } } printListData(data); }
2. 交换排序
2.1 冒泡排序
public void BubbleSort_one(int[] data) { int len = data.length; int times = len - 1; for (int t = 0; t < times; t++) { int signal = 1; for( int i = 0 ; i < len - t - 1; i++ ) { if( data[i] > data[i+1] ) { int tmp = data[i]; data[i] = data[i+1]; data[i+1] = tmp; signal = 0; } } if(signal == 1) break; } printListData(data); } public void BubbleSort_two(int[] data) { int len = data.length; int times = len - 1; for (int t = 0; t < times; t++) { int signal = 1; for( int i = len-1 ; i > t; i-- ) { if( data[i] < data[i-1] ) { int tmp = data[i]; data[i] = data[i-1]; data[i-1] = tmp; signal = 0; } } if(signal == 1) break; } printListData(data); }
2.2 快速排序
public int getPosition(int[] data, int low ,int high) { int tmp = data[low]; while( low < high) { while(low < high && data[high]>=tmp) high--; data[low] = data[high]; while(low < high && data[low]<=tmp) low++; data[high] = data[low]; } data[low] = tmp; return low; } public void QuickSort(int[] data,int low,int high) { if(low<=high) { int position = getPosition(data,low,high); QuickSort(data,low,position-1); QuickSort(data,position+1,high); } }
3. 选择排序
3.1 直接选择排序
public void ChooseSort(int[] data) { int len = data.length; for(int step=0; step < len; step++ ) { int position = step; for (int i=step+1; i<len; i++) { if(data[position] > data[i]) position = i; } if( step != position ) { int tmp = data[step]; data[step] = data[position]; data[position] = tmp; } } printListData(data); }
3.2 堆排序
public void buildHeapTree(int[] data,int i) { for(int j=(i-1)/2;j>=0;j--) { int tmp_j = j; int left = 2*j+1; int right = 2*(j+1); int sign = -1; while(right <=i && left<=i) { if(right<i && data[right]>data[left]) sign = right; else sign = left; if(data[sign] > data[tmp_j]) { int tmp = data[sign]; data[sign] = data[tmp_j]; data[tmp_j] = tmp; tmp_j = sign; left = 2*tmp_j+1; right = 2*(tmp_j+1); } else break; } } } public void getMinDataByTree(int[] data,int i) { int min = data[0]; data[0] = data[i]; data[i] = min; } public void HeapSort(int[] data) { int len = data.length; buildHeapTree(data,len); for(int i=len;i>0;i--) { getMinDataByTree(data,i-1); buildHeapTree(data,i-1); } printListData(data); }
4. 归并排序
4.1 二路归并排序
public void Merge(int[] data,int low,int mid,int high) { int len = high - low + 1; int[] tmp_data = new int[len]; int m = low, n=mid+1, j=0; while(m<=mid&&n<=high) { if(data[m]<data[n]) tmp_data[j++] = data[m++]; else tmp_data[j++] = data[n++]; } while(m<=mid) tmp_data[j++] = data[m++]; while(n<=high) tmp_data[j++] = data[n++]; for(int i=low,k=0;i<=high;i++,k++) data[i] = tmp_data[k]; } public void TwoMergeSort(int[] data,int low,int high) { if(low<high){ int mid = (low+high)/2; TwoMergeSort(data,low,mid); TwoMergeSort(data,mid+1,high); Merge(data,low,mid,high); } }
三. 完整代码
import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; public class Main { public int[] getRandomList_one(int n) { int[] data = new int[n]; for( int i=0 ; i<10 ; i++ ) { data[i] = (int)(Math.random()*100); } return data; } public int[] getRandomList_two(int n) { int[] data = new int[n]; Random r = new Random(); for( int i=0 ; i<10 ; i++ ) { data[i] = r.nextInt()%100; } return data; } public void printListData(int[] data) { for(int d : data) System.out.print(d+" "); System.out.println(); } public void printListData_other(int[] data) { boolean signal = false; for(int d : data) { if(signal == false){ signal = true; continue; } System.out.print(d+" "); } System.out.println(); } public void BubbleSort_one(int[] data) { int len = data.length; int times = len - 1; for (int t = 0; t < times; t++) { int signal = 1; for( int i = 0 ; i < len - t - 1; i++ ) { if( data[i] > data[i+1] ) { int tmp = data[i]; data[i] = data[i+1]; data[i+1] = tmp; signal = 0; } } if(signal == 1) break; } printListData(data); } public void BubbleSort_two(int[] data) { int len = data.length; int times = len - 1; for (int t = 0; t < times; t++) { int signal = 1; for( int i = len-1 ; i > t; i-- ) { if( data[i] < data[i-1] ) { int tmp = data[i]; data[i] = data[i-1]; data[i-1] = tmp; signal = 0; } } if(signal == 1) break; } printListData(data); } public void getCurrentTime() { Date date = new Date(); SimpleDateFormat sdf=new SimpleDateFormat("ss"); sdf.format(date); System.out.println("Time now: "+sdf.format(date)); } public void InsertSort(int[] data) { int len = data.length; for(int i=1;i<len;i++) { if(data[i] > data[i-1]) continue; for(int j=i;j>0;j--) { if(data[j] < data[j-1]) { int tmp = data[j]; data[j] = data[j-1]; data[j-1] = tmp; } } } printListData(data); } public void InsertSort_other(int[] data) { int len = data.length; for(int i=2;i<len;i++) { if(data[i]<data[i-1]) { data[0] = data[i]; int j = i-1; do { data[j+1] = data[j]; j--; }while(data[j]>data[0]); data[j+1] = data[0]; } } printListData_other(data); } public void BinInsertSort(int[] data) { int len = data.length; for(int i=1;i<len;i++) { int low = 0 , high = i-1 , mid = (low+high)/2; while(low<=high) { if(data[mid] >= data[i]) high = mid - 1; else if (data[mid] < data[i]) low = mid + 1; mid = (low+high)/2; } int d = data[i]; for(int j = i-1; j>=low ;j--) data[j+1] = data[j]; data[low] = d; } printListData(data); } public int getPosition(int[] data, int low ,int high) { int tmp = data[low]; while( low < high) { while(low < high && data[high]>=tmp) high--; data[low] = data[high]; while(low < high && data[low]<=tmp) low++; data[high] = data[low]; } data[low] = tmp; return low; } public void QuickSort(int[] data,int low,int high) { if(low<=high) { int position = getPosition(data,low,high); QuickSort(data,low,position-1); QuickSort(data,position+1,high); } } public void HashSort(int[] data) { int len = data.length; for( int step = len/2; step>0; step/=2 ) { for(int i = step; i < len; i++) { for(int j = i ; j - step >= 0; j = j - step) { if(data[j-step] > data[j]) { int tmp = data[j-step]; data[j-step] = data[j]; data[j] = tmp; } } } } printListData(data); } public void ChooseSort(int[] data) { int len = data.length; for(int step=0; step < len; step++ ) { int position = step; for (int i=step+1; i<len; i++) { if(data[position] > data[i]) position = i; } if( step != position ) { int tmp = data[step]; data[step] = data[position]; data[position] = tmp; } } printListData(data); } public void buildHeapTree(int[] data,int i) { for(int j=(i-1)/2;j>=0;j--) { int tmp_j = j; int left = 2*j+1; int right = 2*(j+1); int sign = -1; while(right <=i && left<=i) { if(right<i && data[right]>data[left]) sign = right; else sign = left; if(data[sign] > data[tmp_j]) { int tmp = data[sign]; data[sign] = data[tmp_j]; data[tmp_j] = tmp; tmp_j = sign; left = 2*tmp_j+1; right = 2*(tmp_j+1); } else break; } } } public void getMinDataByTree(int[] data,int i) { int min = data[0]; data[0] = data[i]; data[i] = min; } public void HeapSort(int[] data) { int len = data.length; buildHeapTree(data,len); for(int i=len;i>0;i--) { getMinDataByTree(data,i-1); buildHeapTree(data,i-1); } printListData(data); } public void Merge(int[] data,int low,int mid,int high) { int len = high - low + 1; int[] tmp_data = new int[len]; int m = low, n=mid+1, j=0; while(m<=mid&&n<=high) { if(data[m]<data[n]) tmp_data[j++] = data[m++]; else tmp_data[j++] = data[n++]; } while(m<=mid) tmp_data[j++] = data[m++]; while(n<=high) tmp_data[j++] = data[n++]; for(int i=low,k=0;i<=high;i++,k++) data[i] = tmp_data[k]; } public void TwoMergeSort(int[] data,int low,int high) { if(low<high){ int mid = (low+high)/2; TwoMergeSort(data,low,mid); TwoMergeSort(data,mid+1,high); Merge(data,low,mid,high); } } public static void main(String[] args) { Main m = new Main(); int[] data = m.getRandomList_two(10); System.out.println("【Original Data】"); m.printListData(data); /* System.out.println("【BubbleSort】"); m.BubbleSort_two(data); System.out.println("【InsertSort】"); m.InsertSort(data); int[] d = {0,4,73,24,29,-87,65,75,74,-52}; m.printListData_other(d); System.out.println("【InsertSort_S】"); m.InsertSort_other(d); System.out.println("【BinInsertSort】"); m.BinInsertSort(data); System.out.println("【QuickSort】"); m.QuickSort(data, 0, data.length-1); m.printListData(data); System.out.println("【HashSort】"); m.HashSort(data); System.out.println("【ChooseSort】"); m.HashSort(data); System.out.println("【HeapSort】"); m.HeapSort(data);*/ System.out.println("【TwoMergeSort】"); m.TwoMergeSort(data,0,data.length-1); m.printListData(data); } }