一、冒泡排序
先看下这几幅图的规律,有助于你理解其中的思想。
第一幅:
第二幅:
第三幅:
冒泡排序思想:
如原数组{4,3,2,1},我们要将它从小到大排序,则要将大的数字依次往上浮(就好像冒泡现象一样),第一趟为{3,2,1,4},第二趟变为{2,1,3,4},第三趟为{1,2,3,4}。
可见,数组长度为4,只需要4趟就可以将数组排序好,下面粘贴我的代码,如下:
public class MaoPaoPaiXu {
public static void maoPao1(int[] a) {
int tmp = 0;
for(int i = 0; i < a.length - 1; i++) { //排序趟数为a.length-1
for(int j = 0; j < a.length - 1 - i ; j++) { //每趟中的内部排序循环次数为a.length - 1 - i
//注意减i是因为后面的已经排序好了,只需要排序前面的数
if(a[j] > a[j+1]) {
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
System.out.println("");
for(int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
public static void main(String[] args) {
int[] a = {4,3,2,1};
maoPao1(a);
}
}
二、快速排序
快速排序思路:
给定一个数组,首先将第一个数(或最后一个)作为基准值(key),然后从后往前比较,把第一个比key值小的数与key所在位置调换;紧接着,从前往后比较,把第一个比key值大的数与key所在位置调换。以此类推,排序完后,此时在key值左边是比key小的数了,在其右边是比key大的数了。然后采用递归的方法,将key左边与右边的数进行排序即可。
咋们看图说话:
假设有个这样的数组{14,25,3,12,16,1},将其进行快速排序。
可见,在基准值14左边是比14小的数,在其右边是比它大的数了,当然左右两边区间的数也可能是无序的,所以需要对其进行排序,这里使用递归就可以了。
代码解释:
public class Quick {
public static void main(String []args){
int[] a = {14,25,3,12,16,1};
int start = 0; //开始的索引为0
int end = a.length - 1; //结束的索引为a.length - 1
sort(a, start, end); //调用sort函数
for(int i = 0; i < a.length; i++) { //输出快速排序好的数组
System.out.print(a[i] + " ");
}
}
public static void sort(int[] a, int low, int hight) {
int start = low; //将开始的索引赋值给start
int end = hight; //将结束的索引赋值给end
int key = a[low];//选第一个值作为基准值
while(start < end) { //当start小于end的时候进行循环
while(start < end && a[end] >= a[start]) //从后往前与基准值比较,把大于或等于基准值的数排除
end--; //结束的索引自减
if(a[end] < key) { //判断是否比基准值key小,是则替换
int temp = a[end];
a[end] = key;
a[start] = temp;
}
while(start < end && a[start] <= a[end]) //从前往后与基准值比较,把小于或等于基准值的数排除
start++; //开始的索引自增
if(a[start] > key) { //判断是否比基准值key大,是则替换
int temp = a[start];
a[start] = key;
a[end] = temp;
}
}
//递归环节(包括递归出口)
if(start > low) sort(a, low, start - 1); //将key左边的数进行排序,结束的索引变为start - 1
if(end < hight) sort(a, end+1, hight); //将key右边的数进行排序, 开始的索引变为end + 1
}
}