各类排序总结【代码】

13 篇文章 0 订阅

一. 前期准备

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





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值