一、快速排序的思想:
先用简单的一句话概括,每次用数组中一个数字,与他之前的所有数据进行比较,如果满足条件则更换顺序。光这么说,感觉还是有些晦涩难懂,那我们来举个例子看看吧,毕竟要学以致用呀,奥利给。
二、快速排序简单的实现:
1、假设我们现在有一个数组:{5,3,2,4,1}
2、那么我们需要先拿出最前面的两位----
<1>、{5,3}进行比较,并且是用最有一位向前进行比较,3<5,那么交换位置,变为{3,5}
3、那么我们需要先拿出最前面的三位----
<1>、{3,5,2}进行比价,并且是用最有一位向前进行比较,2<5,那么交换位置
<2>、变为{3,2,5},这个时候再用倒数第二位,进行比价2<3;那么交换位置,变为{2,3,5}
4、那么我们需要先拿出最前面的四位位----
<1>、{2,3,5,4}进行比价,并且是用最有一位向前进行比较,4<5,那么交换位置,
<2>、变为{2,3,4,5}这个时候再用倒数第二位,进行比价4>3;那么不必交换位置
<3>、结束本次比较,返回{2,3,4,5}
5、那么我们需要先拿出最前面的五位位----
<1>、{2,3,4,5,1}进行比价,并且是用最有一位向前进行比较,1<4,那么交换位置,
<2>、变为{2,3,4,1,5}这个时候再用倒数第二位,进行比价1<5;那么交换位置
<3>、变为{2,3,1,4,5},这个时候再用倒数第三位,进行比价1<3;那么交换位置,
<4>、变为{2,1,3,4,5},这个时候再用倒数第四位,进行比价1<2;那么交换位置,
<5>、变为{1,2,3,4,5},这个时候再用倒数第五位,没有值了。
<6>、结束本次比较,返回{1,2,3,4,5}
三、看一下代码实现:
如果还是觉得不够清晰,那么请看代码下面的图例
public void test1() {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
int data[] = new int[n + 1];
for (int i = 0; i < n; i++) {
data[i] = cin.nextInt();
}
/**
* 总体思路
* 比如有一个数组列:5,3,2,4,1
* * 一、先拿出2个来,也就是小标是【1】的数字,头两个数字先比较,
* * 二、再拿出3个来,也就是小标是【2】的数字,头三个数字先比较,
* ......
* N、在拿出N个来,也就是下标【n-1】的数字,N个数字进行比较,
* 这个时候,前面的n-1个数组都是有序的,我们只要拿着第N个数,
* 找到他在前面N-1个数字插入的位置,那么排序就完成了。
*/
//外层循环控制次数,保证让后面没有拿到的数字,再比较,比如说
//其实分步来写,就是控制每次比较的长度:
//一、从下标【1】开始,不是从0开始,拿出前两个5,3
//二、从下标【2】开始,拿出前三个3,5,2
for (int i = 1; i < n; i++) {
for (int j = i; j > 0; j--) {
if(data[j] < data[j-1]){
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}else
{
break;
}
}
}
}
四、下面有一幅代码执行图
五、希尔排序:
总体思路:还是先用一句话概括一下,希尔排序就是在快速排序的基础上,每次比较的时候将数组根据步长分为若干组。即步长有是几,我们就可以分为几组。一般我们计算步长的方法是:数组长度/2。
六、希尔排序思路图
七、代码实现
public void test2() {
int data[]={10,16,25,13,21,11,12,15};
int step = data.length;
while(step > 0) {
step = step / 2;
for(int i = step ; i < data.length; i ++) {
for(int j = i ;j - step >= 0; j-= step) {
if(data[j] < data[j - step]) {
int temp = data[j];
data[j] = data[j - step];
data[j - step] = temp;
}else {
break;
}
}
}
}
}