插入排序
一步一步思考,拆分,由浅入深:
-
先找出最小值,小循环没啥大问题再进入下一步,再去思考边界问题。 int minPos = 0;
for (int i = 0; i < arr.length; i++) {
minPos = arr[i] < arr[minPos] ? i : minPos;
}
-
进行大循环 int[] arr = {2, 8, 4, 5, 7, 6, 3, 1, 9};
for (int j = 0; j < arr.length - 1; j++) {
int minPos = j;
for (int i = j + 1; i < arr.length; i++) {
minPos = arr[i] < arr[minPos] ? i : minPos;
}
System.out.println("minPos:" + minPos);
swap(arr, j, minPos);
}
代码:
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {2, 8, 4, 5, 7, 6, 3, 1, 9};
for (int j = 0; j < arr.length - 1; j++) {
int minPos = j;
for (int i = j + 1; i < arr.length; i++) {
minPos = arr[i] < arr[minPos] ? i : minPos;
}
System.out.println("这是第" + j + "次循环后的数组:");
PrintArr(arr);
System.out.println("minPos:" + minPos);
swap(arr, j, minPos);
}
}
public static void PrintArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void swap(int[] arr, int i, int minPos) {
int temp = arr[i];
arr[i] = arr[minPos];
arr[minPos] = temp;
}
}
大O分析:
最后算得:
n^2/2 - n/2 + T(常数)
以为就算时间复杂度是在大规模计算的前提下,所以计算时间复杂度记得:
所以为 O(n^2)
稳定性:不稳定
两个相同的数,排序先后次序可能发生变化。
改良版:
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {2, 8, 4, 5, 7, 6, 3, 9, 1};
for (int i = 0; i < arr.length / 2; i++) {
int minpos = i;
int maxpos = arr.length - i - 1;
if (arr[minpos] > arr[maxpos]) {
swap(arr, minpos, maxpos);
}
for (int j = i + 1; j < arr.length - i - 1; j++) {
System.out.println("for:" + minpos + " " + maxpos);
minpos = arr[j] < arr[minpos] ? j : minpos;
maxpos = arr[j] > arr[maxpos] ? j : maxpos;
System.out.println("end:" + minpos + " " + maxpos);
}
swap(arr, i, minpos);
swap(arr, arr.length - i - 1, maxpos);
System.out.print("[第" + i + "次]:");
printArr(arr);
System.out.println();
}
}
static void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
static void swap(int[] arr, int i, int minPos) {
int temp = arr[i];
arr[i] = arr[minPos];
arr[minPos] = temp;
}
}
验证算法——对数器
如何验算你的算法是否正确?
- 肉眼观察
- 产生足够多随机样本
- 用确定正确的算法计算样本结果
- 对比被验证算法的结果
public class DateChecker {
static int[] generateRandomArray() {
Random random = new Random();
int[]arr= new int[10000];
for (int i = 0; i < arr.length; i++) {
arr[i]=random.nextInt(10000);
}
return arr;
}
static void check() {
int [] arr = generateRandomArray();
int [] arr2 = new int[arr.length];
System.arraycopy(arr, 0, arr2, 0, arr.length);
Arrays.sort(arr);
SelectSort(arr2);
boolean same = true;
for (int i = 0; i < arr2.length; i++) {
if (arr[i]!=arr2[i]) {
System.out.println(arr[i]+" "+arr2[i]);
same=false;
}
}
System.out.println(same==true?"right":"wrong");
}
static void SelectSort(int[] arr) {
for (int i = 0; i < arr.length / 2; i++) {
int minpos = i;
int maxpos = arr.length - i - 1;
if (arr[minpos] > arr[maxpos]) {
swap(arr, minpos, maxpos);
}
for (int j = i + 1; j < arr.length - i - 1; j++) {
minpos = arr[j] < arr[minpos] ? j : minpos;
maxpos = arr[j] > arr[maxpos] ? j : maxpos;
}
swap(arr, i, minpos);
swap(arr, arr.length - i - 1, maxpos);
}
}
static void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
static void swap(int[] arr, int i, int minPos) {
int temp = arr[i];
arr[i] = arr[minPos];
arr[minPos] = temp;
}
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
check();
}
}
}
|