1 基本概念
▪ 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
▪ 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
2 冒泡排序
2.1 基本思想
▪ 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
▪ 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
▪ 针对所有的元素重复以上的步骤,除了最后一个。
▪ 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
2.2 代码表示
public static void main(String[] args) {
int [] arr= {1,10,20,30,1,90,7,60};
bubblesort(arr);
// bubblesort2(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
}
//大数上浮
public static void bubblesort(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if(arr[j]>arr[j+1]) {
swap(arr,j,j+1);
}
}
}
}
//小数下沉
public static void bubblesort2(int[] arr) {
for (int i = 0; i < arr.length-1; i++) {
for (int j =arr.length-1; j>i; j--) {
if(arr[j]<arr[j-1]) {
swap(arr,j,j-1);
}
}
}
}
//交换数据
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 选择排序
3.1 基本思想
▪ 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
▪ 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
▪ 重复第二步,直到所有元素均排序完毕。
3.2 代码表示
public static void main(String[] args) {
int [] arr= {20,10,20,30,1,90,7,60};
jiaohuan(arr);
// xiaoshu(arr);
// jiaohuan01(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
}
//选择排序
private static void jiaohuan01(int[] arr) {
for (int i = 0; i < arr.length; i++) {
int min =i;
for (int j = i; j < arr.length; j++) {
if(arr[min]>arr[j]) {
min=j;
}
}
if(min!=i) {
zhuanhuan(arr,i,min);
}
}
}
//数据调换
private static void zhuanhuan(int[] arr,int i,int j) {
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
}
结果
4 插入排序
4.1 基本思想
▪ 插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌 。
▪ 插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。
4.2 代码表示
public static void main(String[] args) {
int [] arr= {1,10,20,30,1,90,7,60};
insertSort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+",");
}
}
private static void insertSort(int [] arr) {
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0 && arr[j] < arr[j - 1] ; j--) {
swap(arr, j, j - 1);
}
}
}
//数据调换
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];
}
}
结果