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));
    }
}

运行结果

运行结果

posted @   暴走派大星  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示