本文目录导读:

我来详细讲解Java中实现选择排序的几种方式。
基本选择排序实现
选择排序的核心思想:每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
public class SelectionSort {
/**
* 基本选择排序-升序
* @param arr 待排序数组
*/
public static void selectionSort(int[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
// 假设当前位置是最小值
int minIndex = i;
// 在未排序部分找到最小值
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 交换当前位置和最小值位置
if (minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
}
完整案例演示
public class SelectionSortDemo {
public static void main(String[] args) {
// 测试用例1:基本数组
int[] arr1 = {64, 25, 12, 22, 11};
System.out.println("原始数组: " + arrayToString(arr1));
selectionSort(arr1);
System.out.println("排序后数组: " + arrayToString(arr1));
// 测试用例2:包含重复元素
int[] arr2 = {5, 2, 8, 2, 9, 1, 5};
System.out.println("\n测试重复元素:");
System.out.println("原始数组: " + arrayToString(arr2));
selectionSort(arr2);
System.out.println("排序后数组: " + arrayToString(arr2));
// 测试用例3:已排序数组
int[] arr3 = {1, 2, 3, 4, 5, 6};
System.out.println("\n测试已排序数组:");
System.out.println("原始数组: " + arrayToString(arr3));
selectionSort(arr3);
System.out.println("排序后数组: " + arrayToString(arr3));
// 测试用例4:空数组和单个元素
int[] arr4 = {};
int[] arr5 = {42};
System.out.println("\n测试边界情况:");
System.out.println("空数组: " + arrayToString(arr4));
selectionSort(arr4);
System.out.println("单个元素: " + arrayToString(arr5));
selectionSort(arr5);
}
// 选择排序算法
public static void selectionSort(int[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
swap(arr, i, minIndex);
}
}
}
// 交换数组中的两个元素
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// 数组转字符串
private static String arrayToString(int[] arr) {
if (arr == null || arr.length == 0) {
return "[]";
}
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
if (i < arr.length - 1) {
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
}
增强版选择排序(降序和对象排序)
public class AdvancedSelectionSort {
// 降序排序
public static void selectionSortDesc(int[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int maxIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] > arr[maxIndex]) {
maxIndex = j;
}
}
if (maxIndex != i) {
int temp = arr[i];
arr[i] = arr[maxIndex];
arr[maxIndex] = temp;
}
}
}
// 泛型版本(支持对象排序)
public static <T extends Comparable<T>> void selectionSortGeneric(T[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j].compareTo(arr[minIndex]) < 0) {
minIndex = j;
}
}
if (minIndex != i) {
T temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
// 排序过程可视化(每一步)
public static void selectionSortWithSteps(int[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
int n = arr.length;
System.out.println("选择排序过程演示:");
System.out.println("初始数组: " + arrayToString(arr));
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
System.out.println("第 " + (i + 1) + " 步: " + arrayToString(arr));
}
}
}
}
测试主程序
public class TestSelectionSort {
public static void main(String[] args) {
// 测试基本排序
System.out.println("=== 基本选择排序测试 ===");
int[] arr1 = {64, 34, 25, 12, 22, 11, 90};
System.out.println("排序前: " + arrayToString(arr1));
SelectionSortDemo.selectionSort(arr1);
System.out.println("排序后: " + arrayToString(arr1));
// 测试降序排序
System.out.println("\n=== 降序排序测试 ===");
int[] arr2 = {64, 34, 25, 12, 22, 11, 90};
System.out.println("排序前: " + arrayToString(arr2));
AdvancedSelectionSort.selectionSortDesc(arr2);
System.out.println("降序后: " + arrayToString(arr2));
// 测试泛型版本
System.out.println("\n=== 泛型版本测试 ===");
String[] arr3 = {"banana", "apple", "cherry", "date"};
System.out.println("排序前: " + arrayToString(arr3));
AdvancedSelectionSort.selectionSortGeneric(arr3);
System.out.println("排序后: " + arrayToString(arr3));
// 测试排序过程可视化
System.out.println("\n=== 排序过程演示 ===");
int[] arr4 = {29, 10, 14, 37, 13};
AdvancedSelectionSort.selectionSortWithSteps(arr4);
}
// 辅助方法:数组转字符串
private static String arrayToString(int[] arr) {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
if (i < arr.length - 1) sb.append(", ");
}
sb.append("]");
return sb.toString();
}
private static <T> String arrayToString(T[] arr) {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
if (i < arr.length - 1) sb.append(", ");
}
sb.append("]");
return sb.toString();
}
}
性能测试
public class SelectionSortPerformance {
public static void main(String[] args) {
// 创建测试数组
int size = 10000;
int[] arr = new int[size];
Random random = new Random();
for (int i = 0; i < size; i++) {
arr[i] = random.nextInt(10000);
}
// 计时
long startTime = System.currentTimeMillis();
SelectionSortDemo.selectionSort(arr);
long endTime = System.currentTimeMillis();
System.out.println("排序 " + size + " 个元素用时: " + (endTime - startTime) + " 毫秒");
}
}
-
算法特点:
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 不稳定排序算法
-
实现要点:
- 找到未排序部分的最小值索引
- 与当前位置交换
- 支持升序和降序
-
优缺点:
- 优点:简单直观,数据交换次数少
- 缺点:效率较低,不适合大数据集
-
适用场景:
- 数据量较小(< 1000)
- 对稳定性没有要求
- 需要简单易懂的实现
这个实现包含了基本选择排序、降序排序、泛型版本和可视化版本,可以根据实际需求选择合适的实现方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播