各类排序总结【代码】

来源:互联网 发布:淘宝办理信用卡 编辑:程序博客网 时间:2024/06/09 08:24

一. 前期准备

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;elsesign = 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;elsesign = 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);}}





原创粉丝点击