Java代码实现选择排序:直接选择排序和堆排序

直接选择排序

第 i 次选取从 i 到 sorted.length - 1 之间的最小值 与 sorted[i] 进行位置交换(数组名为sorted)

堆排序

详细原理
https://blog.csdn.net/u010452388/article/details/81283998

代码实现:

public class SelectSort{
	//直接选择排序(升序)
	public static void straightSelectSort(int[] sorted){
		int sortedLen = sorted.length;
		//从第 i 次开始每次选取从 i 到 sorted.length - 1 之间的最小值
		for(int i = 0;i < sortedLen;i++){
			//先将未排序的序列的最左边的数据和位置存放起来 作为未排序序列的目前最小值
			int temp = sorted[i];
			int position = i;
			//创建一个哨兵从当前位置的右边开始循环寻找最小值
			int j;
			for(j = i + 1;j < sortedLen;j++){
				//如果循环的数据比存放的数据小
				if(sorted[j] < temp){
					//那么将循环到的数据存放起来,替换目前最小值
					temp = sorted[j];
					//将该数据的位置替换先前的位置
					position = j;
				}
			}
			//将此循环找到的最小值 和 未排序的序列最左边的数据 位置交换
			sorted[position] = sorted[i];
			sorted[i] = temp;
		}
	}
	//直接选择排序结束
	
	//堆排序(升序)
	public static void heapSort(int[] sorted){
		int sortedLen = sorted.length;
		//构造大根堆
		for(int i = 0;i < sortedLen;i++){
			//获取当前结点索引,以及父结点
			int currentIndex = i;
			int fatherIndex = (currentIndex - 1) / 2;
			//如果子结点大于父结点,那么交换父子结点的位置
			//并以交换后的父结点作为子结点,继续与其父结点比较
			while(sorted[currentIndex] > sorted[fatherIndex]){
				int temp = sorted[currentIndex];
				sorted[currentIndex] = sorted[fatherIndex];
				sorted[fatherIndex] = temp;
				currentIndex = fatherIndex;
				fatherIndex = (currentIndex - 1) / 2;
			}
		}
		//交换大根堆的最大值和尾结点
		while(sortedLen > 1){
			int max = sorted[0];
			sorted[0] = sorted[sortedLen - 1];
			sorted[sortedLen] = max;
			//固定最大值
			sortedLen--;
			//将剩余的数据重新构造大根堆
			for(int i = 0;i < sortedLen;i++){
				//获取当前结点索引,以及父结点
				int currentIndex = i;
				int fatherIndex = (currentIndex - 1) / 2;
				//如果子结点大于父结点,那么交换父子结点的位置
				//并以交换后的父结点作为子结点,继续与其父结点比较
				while(sorted[currentIndex] > sorted[fatherIndex]){
					int temp = sorted[currentIndex];
					sorted[currentIndex] = sorted[fatherIndex];
					sorted[fatherIndex] = temp;
					currentIndex = fatherIndex;
					fatherIndex = (currentIndex - 1) / 2;
				}
			}
		}
	}
	//堆排序结束
	//测试
	public static void main(String[] args) {
        int[] sort = new int[10];
        sort[0] = 2;
        sort[1] = 88;
        sort[2] = 1;
        sort[3] = 8;
        sort[4] = 7;
        sort[5] = 38;
        sort[6] = 28;
        sort[7] = 72;
        sort[8] = 76;
        sort[9] = 0;
        System.out.println("Before Sort:");
        System.out.println(Arrays.toString(sort));
        SelectSort.heapSort(sort);
        System.out.println("After Sort:");
        System.out.print(Arrays.toString(sort));
    }
}

运行结果

运行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值