排序的几种算法

选择排序

SelectionSort

package jianglongjie;
/*
 * 每次找到最小的和最前交换
 * 循环length次
 * 
 * 时间 o n平方
 * 
 * 想办法优化下: 遍历一次 还可以找出最大值
 */
public class SelectionSort {
	public static void sort(int[] args) {
		int [] arr= {5,3,6,8,1,7,9,4,2};
		
		for(int i=0; i<arr.length-1; i++) {
			int minPos=i;
			
			for(int j=i+1; j<arr.length; j++) {
				if(arr[j] < arr[minPos]) {
					minPos = j;
				}
				
			}
			
			System.out.print("minPos:" + minPos);
			
			swap(arr, i, minPos);
		
			//输出数组
			System.out.println("经过第"+i+"次排序后");
			print(arr);
		}
		
	}

	  static void swap(int[] arr, int i, int minPos) {
		  int temp = arr[i];
			arr[i] = arr[minPos];
			arr[minPos] = temp;
		
	}

	static void print(int[] arr) {
		
		 for(int k=0; k<arr.length; k++) {
				System.out.print(arr[k]+ " ");
			}
	}

	
}

SelectionSortPro

package jianglongjie;
/*
 * 每次找到最小的和最前交换
 * 循环length次
 * 
 * 时间 o n平方
 * 
 * 想办法优化下: 遍历一次 还可以找出最大值
 */
public class SelectionSortPro {
	public static void main(String[] args) {
		int [] arr= {5,3,6,8,1,7,9,4,2};
		
		for(int i=0; i<arr.length-1-i; i++) {
			int minPos=i;
			int maxPos=i;
			for(int j=i+1; j<arr.length-i; j++) {
				if(arr[j] < arr[minPos]) {
					minPos = j;
				}
				if(arr[j] > arr[maxPos]) {
					maxPos = j;
				}
			}
			
			System.out.print("minPos:" + minPos);
			System.out.println(" maxPos:" + maxPos);
			swap(arr, i, minPos);
			swap(arr, arr.length-1-i,maxPos);
			//输出数组
			System.out.println("经过第"+i+"次排序后");
			print(arr);
		}
		
	}

	  static void swap(int[] arr, int i, int minPos) {
		  int temp = arr[i];
			arr[i] = arr[minPos];
			arr[minPos] = temp;
		
	}

	static void print(int[] arr) {
		
		 for(int k=0; k<arr.length; k++) {
				System.out.print(arr[k]+ " ");
			}
	}
}

冒泡排序

BobbleSort

package jianglongjie;
/** 

* @author 作者: 江龙杰

* @version 创建时间:2021年6月26日 下午9:19:29 

* 类说明  每次找到最大一个   找length次

*/
public class BobbleSort {
	public static void main(String[] args) {
		int [] arr= {9,3,1,4,6,8,7,5,2};
		sort(arr);
		print(arr);
	}
	
	
	static void sort(int[] arr) {
		
		for(int i = 0; i<arr.length; i++) {
			
			findMax(arr,arr.length-i-1);
		}
	}

	
	
	 static void findMax(int[] arr, int i) {
		 for(int j = 0; j < i; j++) {
				if(arr[j] > arr[j+1]) {
					swap(arr,j,j+1);
				}
			}
	}


	static void swap(int[] arr, int i, int minPos) {
		  int temp = arr[i];
			arr[i] = arr[minPos];
			arr[minPos] = temp;
		
	}

	static void print(int[] arr) {
		
		 for(int k=0; k<arr.length; k++) {
				System.out.print(arr[k]+ " ");
			}
	}
}


插入排序

InsertionSort

package jianglongjie;
/** 

* @author 作者: 江龙杰

* @version 创建时间:2021年6月26日 下午9:30:42 

* 类说明 
对基本有序数组好用
从第二位开始 看看前面有没小的
向前插入(一个个交换)

*/
public class InsertionSort {
	public static void main(String[] args) {
		int [] arr= {9,3,1,4,6,8,7,5,2};
		sort(arr);
		print(arr);
	}
	
	
	static void sort(int[] arr) {

		for (int i = 1; i < arr.length; i++) {
			for (int j = i; j > 0 && arr[j]<arr[j-1]; j--) {
				if(arr[j] < arr[j-1]) {
					swap(arr,j,j-1);
				}
			}
		}
		
	}


	static void swap(int[] arr, int i, int minPos) {
		  int temp = arr[i];
			arr[i] = arr[minPos];
			arr[minPos] = temp;
		
	}

	static void print(int[] arr) {
		
		 for(int k=0; k<arr.length; k++) {
				System.out.print(arr[k]+ " ");
			}
	}
}

InsertionSortPro

package jianglongjie;
/** 

* @author 作者: 江龙杰

* @version 创建时间:2021年6月26日 下午9:43:59 

* 类说明   用临时变量记录插入项 改进不用swap方法      因为是插入   234561         123465    把23456直接向后推 
*/
public class InsertionSortPro {
	public static void main(String[] args) {
		int [] arr= {9,3,1,4,6,8,7,5,2};
		sort(arr);
		print(arr);
	}
	
	
	static void sort(int[] arr) {

		for (int i = 1; i < arr.length; i++) {
			 int temp = arr[i];
				int j;
				for (j = i; j > 0 && arr[j - 1] > temp; j--) {
					arr[j] = arr[j - 1];
				}
				arr[j] = temp;
		}
		
	}


	

	static void print(int[] arr) {
		
		 for(int k=0; k<arr.length; k++) {
				System.out.print(arr[k]+ " ");
			}
	}
}

希尔排序

ShellSort

package jianglongjie2;
/** 

* @author 作者: 江龙杰

* @version 创建时间:2021年6月26日 下午10:19:04 

* 类说明   先 4格一跨 排序   在 4/2   4/2/2

*/
public class ShellSort {

	
	public static void main(String[] args) {
		int [] arr= {9,6,11,3,5,12,8,7,10,15,14,4,1,13,2};
		sort(arr);
		print(arr);
	}
	
	static void sort(int[] arr) {

		int h = 1;
		while( h <= arr.length /3) {
			
			h= h*3 +1;
		}
		//for(int gap = arr.length >> 1; gap > 0; gap /=2 ) {
		for(int gap = h >> 1; gap > 0; gap =(gap-1)/3 ) {
			for (int i = gap; i < arr.length; i++) {
				for (int j = i; j > gap-1 ; j-=gap) {
					if(arr[j] < arr[j-gap]) {
			  			swap(arr,j,j-gap);
					}
				}
			}
		}
		
		
		 
	}


	static void swap(int[] arr, int i, int minPos) {
		  int temp = arr[i];
			arr[i] = arr[minPos];
			arr[minPos] = temp;
		
	}

	static void print(int[] arr) {
		
		 for(int k=0; k<arr.length; k++) {
				System.out.print(arr[k]+ " ");
			}
	}
}

归并排序

MergeSort1.0

package jianglongjie2;
/** 

* @author 作者: 江龙杰

* @version 创建时间:2021年6月26日 下午11:42:03 

* 类说明 归并version 1.0

*/
public class MergeSort {
	public static void main(String[] args) {
		
		int[] arr = {1,4,7,10,3,6,9};
		sort(arr);
		print(arr);
		
	}
	
	static void sort(int[] arr) {

		int mid = arr.length / 2;
		System.out.println(mid);	
		int i = 0;
		int j = mid + 1;
		
		int[] temp = new int [arr.length];
		int k=0;
		
		while (i <= mid  && j < arr.length ) {
			
			temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
//			if(arr[i] < arr[j] ) {
//				temp[k++] = arr[i++];System.out.println(temp[k-1]);	
//			}else {
//				temp[k++] = arr[j++];System.out.println(temp[k-1]);
//			}
			
		}
		print(temp);
		System.out.println("i=" +i + "j=" + j);
		
		while (i <= mid) {temp[k++] = arr[i++];System.out.println("dd 1" + k);}
		while( j < arr.length) { temp[k++] = arr[i++];System.out.println("dd " + k);}
		print(temp);
	}
	
	static void swap(int[] arr, int i, int minPos) {
		  int temp = arr[i];
			arr[i] = arr[minPos];
			arr[minPos] = temp;
		
	}

	static void print(int[] arr) {
		
		 for(int k=0; k<arr.length; k++) {
				System.out.print(arr[k]+ " ");
			}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值