写了个快排,思路比较简单:
思想:分治思想,即对一个大问题分割成几部分(一般而言分割两部分)
条件:数组
根据分治思想,对数组进行分割,需要一个标准pivot,此pivot一般都有专门的算法,且因为选择此pivot会影响数组快排的质量——速度。在此选择快排数组首地址位为pivot。对数组分割成两部分,左边部分为小于pivot的数据,右边部分为大于pivot的数据。依次作为递归的前次。
然后对左右两部分数组再次执行此操作。
1.这里为了减少交换次数,所以把pivot单独保存出来,为key;
2.循环遍历
1)首先从右往左遍历,找出小于key值的数据,交换数组i和j位置上的数据;
2)交换后从左往右遍历,找出大于key值的数据,交换数组i和j位置上的数据;
3.循环后i值为key所在数组地址,交换后,对左右两部分数组再快排。
相对较为重要的一点:i值
由于交换过程中,每次交换过后,i地址即为所对应的key值。
public void sort(int[] array,int left,int right){
if(left>right) return;
int len = right-left+1;
if(len==1) return;//判断数组长度
int i=left,j=right;
int key = array[left];
while(i<j){
while(j>i && array[j]>key){
j--;
}
if(i<j){
array[i] = array[j];
i++;
}
while(i<j && array[i]<key){
i++;
}
if(i<j){
array[j] = array[i];
j--;
}
}
array[i] = key;
sort(array,left,i-1);
sort(array,i+1,right);
}