冒泡排序
原理: 比较、交换
- 相邻元素进行比较,前一个大就交换两元素,反之不做交换
- 交换(或不交换)之后往后移动一位继续比较之后的两元素
- 每完成一轮比较找出最大的元素被排在了最后,因此一共需要比较n-1次
- 下一轮比较的时候可以少比较一个
//冒泡排序
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
char[] a = s.toCharArray();
char temp;
for (int i = 0; i < a.length-1; i++) {
for (int j = 0; j < a.length-1-i; j++) {
if (a[j] > a[j+1]) {
temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
System.out.println(a);
}
}
时间复杂度
- 若初始序列为“正序”序列,则只需要进行1趟排序。在排序过程中进行n-1次关键字之间的比较,且不移动记录;反之若初始序列为“逆序”序列,则将需要n-1趟的排序,需要进行n(n-1)/2次的比较,并做等数量级的交换操作,因此总的时间 复杂度为O(nn)。
选择排序
原理:选择最小(大)、交换
- 1、先在没有排序的序列中找出最小(或者最大)的元素
- 2、与无需序列最前面的元素交换(即放在无序列的最前面,有序序列的最后面),此时无需序列元素数量减一,有序序列加一
- 3、再从这个无需序列中找出最小(或者最大)元素,重复2,重复这个循环
- 需要进行n-1趟
//选择排序
import java.util.Scanner;
public class SelectionSort {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
char[] a = s.toCharArray();
char temp;
int minIndex;
for (int i = 0; i < a.length-1; i++) {
minIndex = i;
for (int j = i+1; j < a.length; j++) {
if (a[j] < a[minIndex]) {
minIndex = j;
}
}
if (i != minIndex) {
temp = a[i];
a[i] = a[minIndex];
a[minIndex] = temp;
}
}
System.out.println(a);
}
}
插入排序
原理:比较、找一个小于当前元素的元素、移动元素序列、插入当前元素
- 把前面 n 个元素看为有序的子序列,将后面的一个元素插入进去这个有序序列中
- 从右往左扫描这个有序的子序列,直到遇到一个小于当前元素的元素
- 将当前元素插入到这个元素的后面
import java.util.Scanner;
public class InsertionSort {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
char[] a = s.toCharArray();
insertionSort(a);
System.out.println(a);
}
public static void insertionSort(char[] a) {
char temp;
for (int i = 0; i < a.length; i++) {
temp = a[i];
int j = i - 1;
while (j >= 0 && a[j] > temp) {
a[j + 1] = a[j];
j--;
a[j + 1] = temp;
}
}
}
}
归并排序
原理: