选择排序、冒泡排序、插入排序

1. 对数器的设定

1.1. 对数器概念和使用

  - 有一个你想要的测的方法a
  - 实现一个绝对正确但是复杂度不好的方法b
  - 实现对比的方法

  • 把方法a和方法b对比很多次来验证方法a是否是正确的

  • 如果有个样本使得对比出错,打印出样本分析是哪个方法出错的

  • 当样本数量很多的时候,对比测试依然正确,可以确定方法a已经正确  

1.2. 数组排序对数器

package com.company;
import java.util.Arrays;
public class Main {
private static final int MIN = 0;
private static final int MAX = 1000;
private static final int MAXLENGTH = 10000;
private static final int FREQUENCY = 10000;
public static void main(String[] args) {
// write your code here
boolean succeed = true;
for (int i = 0; i < FREQUENCY; i++) {
int[] arr = GenerateRandom();
int[] arr2 = Arrays.copyOf(arr, arr.length);
// Arrays.sort(arr);你测试的排序函数
comparator(arr2);
if (!Arrays.equals(arr, arr2)) {
succeed = false;
break;
}
}
System.out.println(succeed?"succeed":"failed");
}
/*
产生随机数组
*/
public static int[] GenerateRandom(){
int length = (int)(MAXLENGTH*Math.random());
int[] arr = new int[length];
for (int i = 0; i < length; i++) {
arr[i] = MIN + (int)(Math.random()*(MAX-MIN));
}
return arr;
}
/*
最稳健的对比算法作为对比,此处调用JDK自带的排序算法
*/
public static void comparator(int[] arr){
Arrays.sort(arr);
}
}

2. 选择排序

选择排序的实质就是每次从剩下的数组中选出最值

/*
选择排序:实质就是每次选出最值
*/
public static void chooseSort(int[] arr){
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length ; j++) {
if (arr[j] < arr[minIndex]) { //choose minimum value
minIndex = j;
}
}
if (i != minIndex)
swap(arr, i, minIndex);
}
}
private static void swap(int[] arr, int i, int j) {
arr[i] = arr[i]^arr[j];
arr[j] = arr[i]^arr[j];
arr[i] = arr[i]^arr[j];
}

3. 冒泡排序

冒泡排序的实质就是进行N次比较

/*
冒泡排序:实质就是进行N次比较
*/
private static void bubbleSort(int[] arr){
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (arr[j] > arr[j+1]){
swap(arr, i, j);
}
}
}
}

4. 插入排序

插入排序的实质就是将一个数插入一个有序数组

/*
插入排序:实质就是将一个数插入一个有序数组
*/
private static void insertSort(int[] arr){
for (int i = 1; i < arr.length; i++) {
int tmp = arr[i];
int j = i;
while (j>0 && arr[j-1]>tmp){//将比他大的数后移
arr[j] = arr[j-1];
j--;
}
if (i != j)//如果有比他小的数就插入,如果没有就下一次循环
arr[j] =tmp;
}
}
posted @   当时明月在曾照彩云归  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示