·
排序算法–选泡插
常见排序:
选择,冒泡,希尔,插入,堆,归并,快速
,桶,计数,基数排序
打油诗–对应平均复杂度和稳定性
选泡插,
快归堆希桶计基,
恩方恩老恩一三,
对恩加K恩乘K,
不稳稳稳不稳稳,
不稳不稳稳稳稳。
选择排序
算法思想:多次遍历数组,每次都找到最小的数放到最前面。
public static void main(String[] args) {
int[] arr = {8,7,6,5,4,3,2,1};
for (int i : arr) {
System.out.print(i+" ");
}
for (int i = 0; i < arr.length; i++) {
int minIndex = i;
for (int j = i+1; j < arr.length; j++) {
if(arr[j] < arr[minIndex]){
minIndex = j;
}
}
int min = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = min;
System.out.print("
----------第"+(i+1)+"次遍历后----------
");
for (int i1 : arr) {
System.out.print(i1 + " ");
}
}
System.out.println("");
}
冒泡排序
思路:每次遍历将最大的数移到末尾
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {1,4,7,5,6,3,2,8};
print(arr);
sort(arr);
}
static void sort(int[] a){
for (int i = a.length-1; i >0; i--) {
//优化如果某次遍历过程中一次交换也没有发生,就说名已经排好了,这是可以直接跳出循环
boolean flag = false;
for (int j = 0; j < i; j++) {
if(a[j] > a[j+1]){
flag = true;
swap(a, j, j+1);
}
}
System.out.println("第"+(a.length-i)+"排序后:");
print(a);
if(!flag) {
break;
}
}
}
static void swap(int[] a, int i, int j){
a[i] = a[i]+a[j];
a[j] = a[i]-a[j];
a[i] = a[i]-a[j];
}
static void print(int[] a){
for (int i : a) {
System.out.print(i + " ");
}
System.out.println("
");
}
插入排序
思路:直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。
public class InsertSort {
public static void main(String[] args) {
int[] arr = {8,4,7,5,6,3,2,1};
print(arr);
sort(arr);
}
static void sort(int[] a){
for (int i = 1; i < a.length; i++) {
for (int j = i; j > 0; j--) {
if(a[j] < a[j-1]){
swap(a, j, j-1);
}else {
break;
}
}
System.out.println("第"+(i)+"次排序后:");
print(a);
}
}
static void swap(int[] a, int i, int j){
a[i] = a[i]+a[j];
a[j] = a[i]-a[j];
a[i] = a[i]-a[j];
}
static void print(int[] a){
for (int i : a) {
System.out.print(i + " ");
}
System.out.println("
");
}
}