前面的话:
把自己总结的排序方法分享一下,也当作自己的笔记本了
冒泡: 冒泡排序算法的主要思想是每次只比较相邻的两个元素,一轮排序之后,最大的元素就会沉到最下面(全文默认升序),然后每次循环比较,就可以得到一个已排序好的数组。
代码实现:
public static void main(String[] args) {
int[] num = {8,20,1,3,9,5,41,10,11,2};
//冒泡排序
for (int i = 0; i < num.length-1; i++) { //控制比较轮次
for (int j = 0; j < num.length-i-1; j++) { //控制每轮中各个元素的比较次数
if (num[j]>num[j+1]) { //升序
int temp = num[j+1];
num[j+1] = num[j];
num[j] = temp;
}
}
}
Out(num);
}
//输出数组中元素
public static void Out(int[] arrs) {
for (int i = 0; i < arrs.length; i++) {
System.out.println(arrs[i]);
}
}
经过这样的排序之后,数组就有序了!其中内循环为什么要写 num.length-i-1 呢? 因为经过一轮循环之后,最大的元素就会沉到最下面,所以在后面比较的时候就不需要再参与比较了。num[j]>num[j+1] 这个是只比较两个相邻的元素。
快速排序: 快速排序算是冒泡排序的改进算法,有很多方法可以实现,我这里用了最经典的 挖坑法 来解决问题,直接上代码。
代码实现:
static void sort(int[] a,int low,int high){
int start = low;
int end = high;
int key = a[low];
while(end>start){
//从后往前比较
while(end>start&&a[end]>=key) //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较
end--;
if(a[end]<=key){
int temp = a[end];
a[end] = a[start];
a[start] = temp;
}
//从前往后比较
while(end>start&&a[start]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置
start++;
if(a[start]>=key){
int temp = a[start];
a[start] = a[end];
a[end] = temp;
}
//此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用
}
//递归比较后面的数据
//现在数组右边的都是比第一轮哨兵小的数据
//数组左边的数据都是比第一轮哨兵大的数据
//两边数据中不是有序的,所以后面要递归排序
if(start>low) sort(a,low,start-1);//左边序列。第一个索引位置到关键值索引-1
if(end<high) sort(a,end+1,high);//右边序列。从关键值索引+1到最后一个
}
public static void main(String[] args) {
int[] num = {80,16,100,35,85,20,12,90,110,5};
sort(num, 0, num.length-1);
//out
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] + " ");
}
}
可能大家看的云里雾里的,下面附上小编准备的一张手写步骤纸:
自己亲手将快排的第一轮的排序过程写了出来,还算清晰,其中,在每轮排序的时候都会设置一个哨兵(key) 来和后面的数据进行比较,比较的顺序是 左右交替 进行比较。