java四大常用排序算法

java四大常用排序算法

时间复杂度对比
package www.suanfa.sort;

/**

  • 方法描述:
  • 冒泡排序
  • 快速排序
  • 插入排序
  • 选择排序
  • 折半查找
  • @author PC

*/
public class Sort {

/**
 * 测试方法
 * @param args
 */
public static void main(String[] args) {
	int[] arr={0,3,5,2,7,1,8,3,11};

// int[] bubblearr=bubbleSort(arr);
// int[] bubblearr=quickSearch(arr, 0, arr.length-1);
// int[] bubblearr=insertSort(arr);
int[] bubblearr=selectSort(arr);
for (int i : bubblearr) {
System.out.println(i);
}

	int a=binarySearch(bubblearr, 1);
	System.out.println("________________");
	System.out.println(a);
	
}


/**
 * 冒泡排序——循环遍历数组,依次把大的数排到后面
 * @param arr
 * @return int[]
 */
public static int[] bubbleSort(int[] arr) {
	
	int i,j;
	//for(i=arr.length;i>0;i--) {
	//排序次数
	for(i=0;i<arr.length-1;i++) {	
		//每次排序前后两个数对比
		for(j=1;j<arr.length-i;j++) {
			//当前面的数大于后面时交换
			if(arr[j-1]>arr[j]) {
				int temp=arr[j];
				arr[j]=arr[j-1];
				arr[j-1]=temp;
			}
		}
	}
	
	return arr;
	
}


/**
 * 快速排序——取出一个基准,分别从后往前找小于基准胡数(不换位置)再从前往后找大于基准的数
 * 再把他们交换,也就相当于一个交换同时完成了划分大于基准的肯小于基准的!
 * @param arr
 * @param low
 * @param hight
 * @return
 */
public static int[] quickSearch(int[] arr,int low,int hight) {
	
	//取出基准
	int key=arr[low];
	
	int begin=low;
	int end=hight;
	
	if(low>hight) return null;
	while(begin<end ) {
		
		//从后往前对比,知道遇到后面小于基准的停下来
		while(arr[end]>=key&&begin<end) {
			end--;
		}
		//从前往后对比,知道遇到前面大于基准的停下来
		while(arr[begin]<=key&&begin<end)
			begin++;
		
		//交换
		if(begin<end) {
			int temp=arr[begin];
			arr[begin]=arr[end];
			arr[end]=temp;
		}
	}
	
	//把基准放到中间位置,即把数组分成大于基准和小于基准的两部分
	arr[low]=arr[begin];
	arr[begin]=key;
	//递归
	if(low<begin) quickSearch(arr, low, begin-1);
	if(hight>end) quickSearch(arr, end+1, hight);
	
	return arr;
}

/**
 * 插入排序——默认插入数的左边已经排好序了!
 * @param arr
 * @return
 */
public static int[] insertSort(int[] arr) {
	int i,j;
	for(i=1;i<arr.length;i++) {
		//取出待插入的数
		int insertVal=arr[i];
		int index=i-1;
		//循环遍历插入左边的数且要求比它大就-1否则退出
		while(insertVal<arr[index]&&index>0) {
			//记得往后移动
			arr[index+1]=arr[index];
			
			//当退出循环时index-1了,所以在插入有时候index要加1;
			index--;
		}
		
		//将数插入到index+1的位置
		//当退出循环时index-1了,所以在插入有时候index要加1;
		arr[index+1]=insertVal;
		
		
	}
	
	return arr;
}

/**
 * 选择排序——循环选择最小的数值放到前面来
 * @param arr
 * @return
 */
public static int[] selectSort(int[] arr) {
	
	int i,j,temp;
	
	for(i=0;i<arr.length-1;i++) {
		//记录最小的下标
		int min=i;
		//循环对比,但赋值的是下标
		for(j=i+1;j<arr.length;j++) {
			if(arr[min]>arr[j])
				min=j;
			
		}
		
		//判断最小值的下标是不是原来的,否则将他们交换。
		if(min!=i) {
			temp=arr[min];
			arr[min]=arr[i];
			arr[i]=temp;
		}
	}
	
	return arr;
}

/**
 * 折半查找
 * @param arr
 * @param num
 * @return
 */
public static int binarySearch(int[] arr,int num) {
	
	int low=0;
	int high=arr.length-1;
	int mid;
	
	while(low<high) {
		mid=(low+high)/2;
		if(arr[mid]==num)
			return mid;
		if(num<arr[mid])
			high=mid;
		if(num>arr[mid])
			low=mid;
	}
	
	return -1;
}

}

个人博客:java1024家园

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值