快速排序
1.一个无序的数组,设置两个变量,一个left,一个right(left从数组左端开始,向右移动;right从数组右端开始,向左移动)
2.保证left左边的数据都小于left
3.保证right右边的数据都大于right
注意事项:(最省内存的快速排序,不多费哪怕一点力气,就要像我这样做)
1.最外层循环,确定left和right,left是i,right是length-i-1
注意:为什么最外层循环直到length/2就结束了?
试想一下,如果是length是偶数(假如是6),那么length/2 = 3,left到第3个,right到第4个,显然比较已经结束了
假如length是奇数(假如是5),那么length/2 = 2, left到第2个,right到第4个,中间第三个肯定比left大,也肯定比right小,排序显然已经完成,不需要再比了
2.假如你做的和我一样,先是left和右边比,后right和左边比
注意:left比较的时候,一定是从left右边第一个开始,比较到right,同时一定要注意和right比较(为什么呢,试想如果是 2,1,0这样,你比较的时候left不和right比较的话,显然right不一定比left小)
那么如果left和right比较过了,显然right和left比较的时候就可以省去和left比较了
package test;
public class Demo {
//快读排序
public static void kspx(int[] index){
//i is left ; index.length-i-1 is right
for (int i = 0; i < index.length/2; i++) {
//left和右边的比较
for (int j = i+1; j < index.length-i; j++) {
if(index[i]>index[j]){
int temp = index[i];
index[i] = index[j];
index[j] = temp;
}
}
//right和左边的比较
for (int j = i+1; j < index.length-i-1; j++) {
if(index[index.length-i-1]<index[j]){
int temp = index[index.length-i-1];
index[index.length-i-1] = index[j];
index[j] = temp;
}
}
}
for (int i = 0; i < index.length; i++) {
System.out.print(index[i]+" ,");
}
}
public static void main(String[] args) {
int[] index = {8,9,4,5,5,3,6,4,96,9,5,5,65,26,0,1};
new Demo().kspx(index);
}
}
浙公网安备 33010602011771号