您的位置:首页 > 产品设计 > UI/UE

Algorithm——QuickSort

2015-07-28 15:56 417 查看
算法:选取key,将小于key的放key左边,大于key的放右边,然后对左右分别递归调用。

一般选取第一个数array[0]作为key,设置游标i = 0; j = array.length - 1;从右往左找一个小于key的换到左边,再从左往右找一个大于key的换到右边,当i == j时将key放在array[i]就划分完成。

代码如下:

public static void quicksort(int[] array, int start, int end){
for (int i : array) {
System.out.print(i);
}
System.out.println();
if(start == end)
return;

int key = array[start];
int i = start;
int j = end;
while(i < j){
while(i < j && 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--;
}
}
if(i == j)
array[i] = key;

if(i > start)
quicksort(array, start, i - 1);
if(i < end)
quicksort(array, i + 1, end);

}

其实不一定选array[0]作为key,随机选也可以,但是思路要改变。首先选出key,将key换到最后array[end],用一个游标i = -1,然后遍历array,如果当前数字小于key,i++;如果大于key,i不变,当找到下一个小于key 的数时,与这个大于key的数交换,这样保证了i和i左边的数都是小于key的,同样完成了划分工作。

代码如下:

public static void quicksort2(int[] array, int start, int end){
for (int i : array) {
System.out.print(i);
}
System.out.println();

if(start == end)
return;
Random random = new Random();
int index = random.nextInt(end - start) + start;
int key = array[index];
array[index] = array[end];
array[end] = key;
int i = start - 1;
for(int j = start; j < end; j++){
if(array[j] < key){
i++;
if(i != j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
i++;
array[end] = array[i];
array[i] = key;

if(i > start)
quicksort2(array, start, i - 1);
if(i < end)
quicksort2(array, i + 1, end);
}

第一种就理解上来说更容易一点,但是第二种思路可以用于其他的算法题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法