Java排序

记录一下排序的各种实现方法:


	/**
	 * 直接插入排序
	* @Title: insertSort
	* @Description: TODO(这里用一句话描述这个方法的作用)
	* @param @param num 待排序的数组
	* @param @param n  元素个数
	* @return void    返回类型
	* @throws
	 */
	public static void  insertSort(int[] num,int n){
		
		int i = 0;
		int j = 0;
		int tmp = 0;
		for (i = 1; i < n; i++) {
			tmp = num[i];//从待插入组取出第一个元素
			j = i -1;//i-1即为有序组最后一个元素(与待插入元素相邻)的下标。
			while (j>=0&&tmp<num[j]) {//注意判断条件为两个,j>=0对其进行边界限制。第二个为插入判断条件
				num[j+1] = num[j];//若不是合适位置,则有序元素向后移动
				j--;
			}
			num[j+1] = tmp;//找到合适位置,将元素插入
		}
		for (int k = 0; k < num.length; k++) {
			System.out.print(num[k]+",");
		}
	}
	
	
	/**
	 * 冒泡排序
	* @Title: bubbleSort
	* @Description: TODO(冒泡排序)
	* @param @param num
	* @param @param n    参数
	* @return void    返回类型
	* @throws
	 */
	public static void bubbleSort(int[] num,int n){
		
		boolean sign = true;//标志位,初始化为true
		for (int i = n-1; i >0; i--) {
			for (int j = 0; j < i; j++) {
				if (num[j+1]<num[j]) {
				//  如果发生交换,说明数组仍为无序,置标志位为false
					swap(num, i, j);
					 sign = false;
				}
			}
			 //  如果标志位为true,说明上一次循环中没有交换发生,排序可以结束了
			if (sign) {
				return;
			}
		}
		
		for (int k = 0; k < num.length; k++) {
			System.out.print(num[k]+",");
		}
		
	}
	
	
	/**
	 * 希尔排序
	* @Title: shellSort
	* @Description: TODO(这里用一句话描述这个方法的作用)
	* @param @param num
	* @param @param n    参数
	* @return void    返回类型
	* @throws
	 */
	public static void shellSort(int[] num,int n){
		
		int gap,i,j;
		//每循环一次都将gap的值减半
		for(gap = n/2;gap>0;gap /=2){
			//对于gap所分的每一小组,进行插入排序
			for(i=gap;i<n;i++){
				for(j=i-gap;j>=0&&num[j]>num[j+gap];j-=gap){
					//交换位置
					swap(num, i, j);
				}
			}
		}
		
		for (int k = 0; k < num.length; k++) {
			System.out.print(num[k]+",");
		}
	}
	
	/**
	 *  选择排序
	* @Title: selectSort
	* @Description: TODO(这里用一句话描述这个方法的作用)
	* @param @param num
	* @param @param n    参数
	* @return void    返回类型
	* @throws
	 */
	public static void selectSort(int[] num,int n){
		
		for (int i = 0; i < n; i++) {
			//内层循环j=i+1,外层循环控制着循环次数。即每趟中num[i]这个值就是本趟的最小值。i位置上是最小值 
			for (int j = i+1; j < n; j++) {
				if (num[i]>num[j]) {
					swap(num, i, j);
				}
			}
		}
		for (int k = 0; k < num.length; k++) {
			System.out.print(num[k]+",");
		}
	}
	
	
	/**
	 * 堆排序
	* @Title: heapSort
	* @Description: TODO(这里用一句话描述这个方法的作用)
	* @param @param num
	* @param @param n    参数
	* @return void    返回类型
	* @throws
	 */
	public static void heapSort(int[] num,int n){
		
		//1,构建大顶堆
		for (int i = n/2-1; i>=0; i--) {
			//从第一个非叶子节点从左至右,从下至上进行调整
			adjustHeap(num,i,n);
		}
		//2,调整堆结构+交换堆顶元素与末尾元素
		for(int j = n -1;j>0;j--){
			swap(num, 0, j);//将堆顶元素与末尾元素进行互换
			adjustHeap(num, 0, j);//重新对堆进行调整
		}
		
		for (int k = 0; k < num.length; k++) {
			System.out.print(num[k]+",");
		}
	}
	
	
	/**
	 * 快速排序
	* @Title: quikSort
	* @Description: TODO(这里用一句话描述这个方法的作用)
	* @param @param num
	* @param @param n    参数
	* @return void    返回类型
	* @throws
	 */
	public static void quickSort(int[] num,int start,int end){
		
		if (num==null) {
			return;
		}
		//如果左边大于右边,则return,这里是递归的终点,需要写在前面
		if (start>=end) {
			return;
		}
		
		int i = start;
		int j = end;
		int baseNum = num[i];//选基准值(选取第一个值为基准值)
		int midNum;//记录中间值
		 //此处开始进入遍历循环  
        do {
			while ((num[i]<baseNum)&&i<end) {
				i++;
			}
			while ((num[j]>baseNum)&&j>start) {
				j--;
			}
			if (i<=j) {
				midNum = num[i];
				num[i] = num[j];
				num[j] = midNum;
				i++;
				j--;
			}
		} while (i<=j);
        
        if (start<j) {
			quickSort(num, start, j);
		}
        
        if (end>i) {
			quickSort(num, i, end);
		}
		
	}


	/**
	 * 调整大顶堆(仅是调整过程,建立在大顶堆已建立的基础上)
	* @Title: adjustHeap
	* @Description: TODO(这里用一句话描述这个方法的作用)
	* @param @param num
	* @param @param i
	* @param @param n    参数
	* @return void    返回类型
	* @throws
	*/
	private static void adjustHeap(int[] num, int i, int n) {
		// TODO Auto-generated method stub
		int temp = num[i];//取出当前元素i
		for(int k = i*2+1;k<n;k=k*2+1){//从i节点的左子节点开始,也就是2i+1处开始
			if (k+1<n&&num[k]<num[k+1]) {//如果左子节点小于右子节点,K指向右子节点
				k++;
			}
			if (num[k]>temp) {//如果子节点大于父节点,将子节点的值赋给父节点(不用进行交换)
				num[i] = num[k];
				i = k ;
			}else{
				break;
			}
		}
		num[i] = temp;//将temp值放到最终位置
	}


	/**
	 * 数据交换
	* @Title: swap
	* @Description: TODO(这里用一句话描述这个方法的作用)
	* @param @param num
	* @param @param i
	* @param @param j    参数
	* @return void    返回类型
	* @throws
	*/
	private static void swap(int[] num, int i, int j) {
		int temp;
		temp = num[i];
		num[i] = num[j];
		num[j] = temp;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值