比较类排序:冒泡排序、选择排序、插入排序(希尔排序)、归并排序、堆排序、快速排序(二路快排、三路快排)
一、冒泡排序
原理(步骤):
(a)比较相邻的元素,如果第一个比第二个大,就交换。对每一对相邻元素做相同的操作。
(b)一轮结束后,最后的元素应该是当轮中最大的。
(c)下一轮循环时,从第一个元素开始比较,到上一轮比较出的最大元素的前一个结束。
(d)直到没有任何一个数字需要比较,说明已排序好。
稳定排序:比较是相邻两个元素比较,交换也发生在这两个元素之间,所以相同元素的前后顺序没有发生改变。
时间复杂度:O(n^2)
示意图:
参考代码:
import java.util.Arrays;
class BubbleSort{
public static void main(String[] args){
int[] a={6,4,9,1,8,3,2,7,5};
//一共比较几轮
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]){
//交换元素
swap(a,j,j+1);
}
}
}
System.out.println(Arrays.toString(a));
}
public static void swap(int[] a,int i,int j){
//方法一:中间值(通用的)
int temp=a[i];
a[i]=a[j];
a[j]=temp;
//以下是另外两种交换数字的方法
//方法二:加减法(仅适用于数字)
/*
//a[i]=6,a[j]=4
a[i]=a[i]+a[j];//10
a[j]=a[i]-a[j];//a[j]=6
a[i]=a[i]-a[j];//a[i]=4
*/
//方法三:异或(仅适用于数字)
/*
a[i]=a[i]^a[j];
a[j]=a[i]^a[j];
a[i]=a[i]^a[j];
*/
}
}
二、选择排序
原理(步骤):
(a)当前数字与后面每一个元素比一下,当前数字大,交换
(b)一轮结束后,最小元素以产生
(c)下一轮循环,从上一轮比较出最小元素的后一个开始,到最后一个元素结束
(d)直到第n-1个元素,不需要选择了,排序已排好。
不稳定排序:选择排序会改变相同元素的前后顺序。
例如:序列{6,8,6,2,9},第一轮循环,第一个6和2会交换,两个6的顺序已经发生了改变。
示意图:
参考代码:
import java.util.Arrays;
class SelectSort{
public static void main(String[] args){
int[] a={6,4,9,1,8,3,2,7,5};
//一共比较几轮
for(int i=0;i<a.length-1;i++){
//一轮的比较次数,从上一轮得出最小的元素的后一个开始,到最后一个元素结束
for(int j=i+1;j<a.length;j++){
if(a[i]>a[j]){
//交换元素
swap(a,i,j);
}
}
}
System.out.println(Arrays.toString(a));
}
public static void swap(int[] a,int i,int j){
//中间值(通用的)
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}