排序算法(不定时更新~)

插入排序:

/**
	 * 插入排序
	 * 初始时,拿第二个和第一个比较,如果第二个小于第一个,两个交换
	 * 当进行到第N次时,前面的N-1个顺序应该是正确的
	 * 拿第N个和前面的N-1个数比较,如果第M个小于N,M+1大于N,则把N插到M和M+1中间
	 * 相当于将N和前一个数比较,如果前一个数大于N,则把前一个移动到N的位置上,内层的每个循环都是将大于N的数字在向后移以为,也就相当于是将N插在两个之间。
	 * 
	 * 时间复杂度:n+(n-1)+(n-2)+...+1 = (n+1)n/2=n^2   O(n^2) 空间复杂度:O(1) 稳定
	 * @Title: insertionSort 
	 * @author: wanglh3
	 * @Description: TODO
	 * @param numbers
	 * @return void
	 */    
	public static void insertionSort(int[] numbers){
		for(int i=1;i < numbers.length;i++){
			int temp = numbers[i];
			int j = i-1;
			for(; j >=0 && numbers[j]>temp ;j--){
				if(temp < numbers[j]){
					numbers[j+1] = numbers[j];
				}
			}
			System.out.println(j+"----"+temp);
			numbers[j+1] = temp;
		}
	}

二分排序算法应该是插入排序的优化算法,插入时不从一端查找,而是从中间开始查找。


冒泡排序

/**
	 * 冒泡排序
	 * 从后往前,先把最小的移到第一位,然后循环,把次小的移到第二位
	 * 冒泡排序法的改进:
	 * 1.设置一个标志变量,如果某一次排序中,没有进行交换,就可以停止排序
	 * 2.设置一个记录,标志某位之后都已经进行排序,之后排序时,无需对之后的元素进行比较
	 * 3.正向逆向同时排序 
	 * 
	 * 时间复杂度:O(n^2) 空间复杂度O(1) 稳定
	 * @Title: bubbleSort 
	 * @author: wanglh3
	 * @Description: TODO
	 * @param numbers
	 * @return void
	 */
	public static void bubbleSort(int[] numbers){
		for(int i = 1; i < numbers.length; i++){
			for(int j = numbers.length-1; j >= i; j--){
				if(numbers[j] < numbers[j-1]){
					int temp = numbers[j];
					numbers[j] = numbers[j-1];
					numbers[j-1] = temp;
				}
			}
		}
	}


选择排序

/**
	 * 选择排序
	 * 从未排序的数中,选出最小的,与未排序的第一个数值交换
	 * 改进方法:二元选择排序
	 * 每次循环选出最大的和最小的,最小的和前面的交换,最大的和后面的交换
	 * 时间复杂度:O(n^2) 空间复杂度O(1) 不稳定
	 * @Title: selectionSort 
	 * @author: wanglh3
	 * @Description: TODO
	 * @param numbers
	 * @return void
	 */
	public static void selectionSort(int[] numbers){
		for(int i = 0; i < numbers.length-1; i++){
			int index = i;
			int temp = numbers[i];
			for(int j=i+1;j<numbers.length;j++){
				if(numbers[j]<temp){
					temp = numbers[j];
					index = j;
				}
			}
			numbers[index] = numbers[i];
			numbers[i] = temp;
		}
	}


快速排序

/**
	 * 快速排序
	 * 选择一个基准,比他大的,都放到他后面,比他小的,都放到他前面
         * 平均时间复杂度是O(nlogn),空间复杂度是O(logn) 不稳定
	 * @Title: quickSort 
	 * @author: wanglh3
	 * @Description: TODO
	 * @param numbers
	 * @return void
	 */
	public static void quickSort(int[] numbers){
		_quickSort(numbers,0,numbers.length-1);
	}
	public static void _quickSort(int[] numbers,int low,int high){
		if(low < high){
			int _low = partition(numbers,low,high);
			_quickSort(numbers,low,_low-1);
			_quickSort(numbers,_low+1,high);
		}
	}
	//{3,7,9,4,2,8,0,1,5}
	public static int partition(int[] numbers,int low,int high){
		int privotKey = numbers[low];//基准数
		while(low < high){
			//如果num[high]>pri  num[low] = num[high]
			//high--
			//
			while(low < high && numbers[high]>=privotKey){
				high--;//当高位大于基准值时,一直向前移动,直到碰到小于基准值的,跳出循环,将高位赋值给低位
			}
			numbers[low] = numbers[high];
			while(low < high && numbers[low] <= privotKey){
				low++;
			}
			numbers[high]=numbers[low];
			System.out.println();
		}
		numbers[low] = privotKey;
		
		return low;
	}
	//------------快排end----------------




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值