选择排序通过选择和交换来实现排序:
选择排序算法实例——代码实现:
// 选择排序——选择+交换
int[] selectSort(int[] data) {
int index;// 保存每次循环的比较时最小值的地址
int temp;
for (int i = 0; i < data.length - 1; i++) {
index = i;
for (int j = i + 1; j < data.length; j++) {
if (data[j] < data[index]) {
index = j;
}
}
// 交换数据
if (index != i) {
temp = data[index];
data[index] = data[i];
data[i] = temp;
}
// 打印出每次循环排序后的结果
//System.out.println(Arrays.toString(data));
}
return data;
}
运行测试:
// 选择排序算法测试
public static void main(String[] args) {
int[] data = new int[] { 9, 3, 6, 0, 2, 5, 9, 7, 5, 0 };
SuanFa sf = new SuanFa();
data = sf.selectSort(data);
System.out.println(Arrays.toString(data));
}
//运行结果:
[0, 0, 2, 3, 5, 5, 6, 7, 9, 9]
堆结构:一种树结构,准确的说是一个完全二叉树,如果按照从小到大的顺序排序,要求非叶子结点的数据要大于或等于其左右子结点的数据(最大堆);如果按照从大到小的顺序排序,要求非叶子结点数据要小于或等于其左右子结点的数据(最小堆)。即如果要求数组数据从小到大排序时,堆结构的根结点为要求的最大值。
堆排序算法实例——代码实现:
// 堆排序算法——完全二叉树+选择排序(由三个方法构成,最后一个为外部调用方法)
void heapSortUtil1(int[] data, int rootNode, int len) {
int max = rootNode;// 定义最大值在根结点
int leftNode = 2 * max + 1;// 根结点的左子结点
int rightNode = 2 * max + 2;// 根结点的右子节点
// 左子节点存在并且大于根结点、修改max指向最大值
if (leftNode < len) {
if (data[leftNode] > data[max]) {
max = leftNode;
}
}
// 右子节点存在并且大于根结点、修改max指向最大值
if (rightNode < len) {
if (data[rightNode] > data[max]) {
max = rightNode;
}
}
// 如果max指向改变了、则交换根结点数据,使其比左右子节点数据大
if (max != rootNode) {
int temp = data[max];
data[max] = data[rootNode];
data[rootNode] = temp;
// 子节点数据发生改变、递归检查子结点之下的结点数据是否满足要求
heapSortUtil1(data, max, len);
}
}
// 从数组的最后一个元素(树的底部最后一个结点)开始,完成第一次排序(最大值在树根位置)
void heapSortUtil2(int[] data, int len) {
for (int i = len - 1; i >= 0; i--) {
heapSortUtil1(data, i, len);
}
}
// 将最大值交换到树根,然后将最大值转移到数组尾部,树大小减一,再次进行排序选出最大值
int[] heapSort(int[] data) {
for (int i = 0; i < data.length; i++) {
heapSortUtil2(data, data.length - i);
// 上面程序结束后,最大值位于数组第一位,接下来转移最大值到数组尾部
int temp = data[0];
data[0] = data[data.length - 1 - i];
data[data.length - 1 - i] = temp;
}
return data;
}
运行测试:
// 堆排序算法测试
public static void main(String[] args) {
int[] data = new int[] { 9, 3, 6, 0, 2, 5, 9, 7, 5, 0 };
SuanFa sf = new SuanFa();
data = sf.heapSort(data);
System.out.println(Arrays.toString(data));
}
//运行结果:
[0, 0, 2, 3, 5, 5, 6, 7, 9, 9]