共计 2670 个字符,预计需要花费 7 分钟才能阅读完成。
本篇内容主要讲解“Java 选择排序的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“Java 选择排序的方法是什么”吧!
public class SelectSort { public static void main(String[] args) { int[] nums = {49,38,65,97,76,13,27,49};
// simpleSelectSort(nums);
// treeSelectSort(nums);
heapSelectSort(nums);
for (int num:nums) {
System.out.print(num+ \t
}
}
简单排序处理流程
(1)从待排序序列中,找到关键字最小的元素;(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复 (1)、(2) 步,直到排序结束。 static void simpleSelectSort(int[] nums){//7,6,3,4,5
for (int i = 0; i nums.length; i++) {
int minIndex = i;
for (int j = i+1; j nums.length; j++) { if (nums[minIndex] nums[j]) {
minIndex = j;
}
}
if (minIndex!=i) { int temp = nums[i];
nums[i] = nums[minIndex];
nums[minIndex] = temp;
}
}
}
static void treeSelectSort(int[] nums){//19 , 38 , 65 ,97 , 76 ,13 , 27 , 49
int len = nums.length;
int treeSize = 2*len - 1; // 满二叉树的节点数
int low = 0;
int[] tree = new int[treeSize];// 临时的树存储空间
// 由后向前填充此树,索引从 0 开始
for (int i = len -1,j = 0;i = 0;--i,j++){// 填充叶子节点
tree[treeSize - 1 - j] = nums[i];
}
for (int x:tree) {
System.out.print(x+ \t
}
System.out.println();
for (int i = treeSize - 1; i 0; i -=2){// 填充非终端节点
// System.out.println(i+ --- +((i - 1)/2));
tree[(i-1)/2] = (tree[i - 1] tree[i] ? tree[i - 1] : tree[i]);
}
for (int x:tree) {
System.out.print(x+ \t
}
System.out.println();
// 不断移走最小节点
int minIndex;
while (low len){ int min = tree[0]; // 最小值
nums[low++] = min;
minIndex = treeSize - 1;
while(tree[minIndex] != min){// 不断移走最小节点
minIndex--;
}
tree[minIndex] = Integer.MAX_VALUE;// 设置一个最大值标志
// 找到其兄弟节点
while (minIndex 0){// 如果其还有父节点 -- 该步骤旨在重新生成一颗树
if (minIndex % 2 == 0){// 如果是右节点
tree[(minIndex - 1)/2] = (tree[minIndex - 1] tree[minIndex] ? tree[minIndex - 1] : tree[minIndex]);
minIndex = (minIndex-1)/2;
} else {// 如果是左节点
tree[minIndex/2] = (tree[minIndex] tree[minIndex + 1] ? tree[minIndex] : tree[minIndex + 1]);
minIndex = minIndex/2;
}
}
// for (int x:tree) {
// System.out.print(x+ \t
// }
// System.out.println();
}
}
static void heapSelectSort(int[] nums){
int len = nums.length;
// 构建堆
for (int i = (len -1)/2; i = 0; i--) { heapAdjust(nums,i,len);
}
// 输出堆顶元素并调整建新堆的过程
int count = len-1;
while(count 0 ){
// 交换树根与最后一个值
swap(nums,0,count);
count -- ;
heapAdjust(nums,0,count);
}
}
static void heapAdjust(int[] nums, int i, int len) { int parent = nums[i];
for (int j = (i+1)*2 - 1; j len; j=(j+1)*2 - 1) { if (j len -1 nums[j] nums[j+1]){
++j;
}
if (parent nums[j]){
break;
}
nums[i] = nums[j];
i = j;
}
nums[i] = parent;
}
/**
* 交换数组中两元素的值
*/
private static void swap(int[] nums,int i,int j){ int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
到此,相信大家对“Java 选择排序的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
正文完