常见排序算法
目标:用 Junit 练习 4 个常见的排序算法
步骤:
设置成员变量 & 常量
private int[] arr;
private final int[] target = new int[]{19, 24, 29, 47, 47, 71, 78, 99};
加入 @Before 和 @After
@Before
public void start() {
arr = new int[]{47, 29, 71, 99, 78, 19, 24, 47}; // 每个 @Test 运行前,把数组赋给 arr 成员变量
System.out.println("========================== start ==========================");
System.out.println(Arrays.toString(arr));
}
@After
public void after() {
System.out.println(Arrays.toString(arr));
System.out.println("========================== end ==========================");
Assert.assertArrayEquals(target, arr); // 每个 @Test 方法运行后,校验排序结果 arr 是否符合预期
}
1 冒泡排序
@Test
public void bubbleSort(){
System.out.println(String.format("the method %s is running", Thread.currentThread().getStackTrace()[1].getMethodName()));
for (int i = 0; i < arr.length; i++) {
for (int j = 1; j < arr.length - i; j++) {
if (arr[j - 1] > arr[j]) {
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
}
2 选择排序
@Test
public void selectionSort() {
System.out.println(String.format("the method %s is running", Thread.currentThread().getStackTrace()[1].getMethodName()));
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
3 插入排序
@Test
public void insertionSort() {
System.out.println(String.format("the method %s is running", Thread.currentThread().getStackTrace()[1].getMethodName()));
for (int i = 1; i < arr.length; i++) {
int insertVal = arr[i]; // 要插入的值
int index = i - 1; // 要插入的位置
for (;index >= 0 && arr[index] > insertVal; --index) {
arr[index + 1] = arr[index];
}
arr[index + 1] = insertVal;
}
}
4 快速排序
@Test
public void quickSort() {
System.out.println(String.format("the method %s is running", Thread.currentThread().getStackTrace()[1].getMethodName()));
equalsAndMove(0, arr.length - 1);
}
private void equalsAndMove(int start, int end) {
if (start >= end) return; // 递归出口
int inStart = start;
int inEnd = end;
int key = arr[instart]; // 基准值
while (inStart != inEnd) {
// 从右往左遍历,如果元素小于基准值,就把元素的值赋给 inStart(基准值动态位置)
while (inStart < inEnd && key < arr[inEnd]) {
inEnd--;
}
if (inStart < inEnd) {
arr[inStart++] = arr[inEnd];
}
// 从左往右遍历,如果元素大于基准值,就把元素的值赋给 inEnd(基准值动态位置)
while (inStart < inEnd && key > arr[inStart]) {
inStart++;
}
if (inStart < inEnd) {
arr[inEnd--] = arr[inStart];
}
}
arr[inStart] = key; // 至此,左边元素都小于基准值,右边元素都大于基准值
equalsAndMove(start, inEnd - 1); // 递归处理基准值左边的
equalsAndMove(inStart + 1, end); // 递归处理基准值右边的
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY