快速排序:
选择一个数,大于这个数的在右边,小于这个数的在左边
不断地用递归的方法去实现
上动图:
public static <E extends Comparable<E>> void sort(E[] data,int l,int r){
//求解最基本的问题
if (l>=r)return ;//当数组里面没有元素或者元素为一个时,就不用排序
// <4 4(data[p]) >4
int p=partition(data,l,r);//如何partition(分区)?
//把问题转换成小的问题来解决
sort(data,l,p-1);
sort(data,p+1,r);
}
public static <E extends Comparable<E>> int partition(E[] data,int l,int r){
//[l...r]区间生成一个随机索引
//为了避免完全有序的数组所引发的O(n^2)时间复杂度的问题
int index=l+(new Random()).nextInt(r-l+1);//
swap(data,l,index);//把这个随机元素与l开头位置的元素交换
//data[l+1...j]<v data[j+1...i)>=v
int j=l;//把第一个索引对应的值作为v
for (int i=l+1;i<=r;i++){//从第二个元素开始到最后一个元素结束
if (data[i].compareTo(data[l])<0){//不断地与第一个元素v比较,小于v时
j++;//记住v到时候要在那个位置
swap(data,i,j);//不断让小于v的元素往前靠,小的在前,大的在后面
}
}
swap(data,l,j);//把第一个元素v放到中间
return j;
}
public static <E extends Comparable<E>> void swap(E[] data,int i,int j){
E temp;
temp=data[i];
data[i]=data[j];
data[j]=temp;
}
public static void main(String[] argc){
Integer[] data={3,4,1,7,0,8,5,9,2,6};
sort(data,0,data.length-1);
for (int i=0;i<data.length-1;i++){
System.out.print(" "+data[i]);
}
}
只要选择的事情所造成的后果在自己的承受能力范围之内的话,那就选择自己喜欢的事情做吧!
“人为什么不能一辈子只做自己有热情并且擅长的事,而要挣扎着去做自己认为对的事。”