您的位置:首页 > 编程语言 > Java开发

快速排序算法学习心得(Java实现)

2016-05-11 16:44 309 查看
先上代码:

​int AdjustArray(int s[], int l, int r) //返回调整后基准数的位置,传入的参数分别是:子数组,子数组的第一个数的下标,最后一个数的下标

{

int i = l, j = r;

int x = s[l]; //s[l]即s[i]就是第一个坑

while (i < j)

{

// 从右向左找小于x的数来填s[i]

while(i < j && s[j] >= x) //不要以为这个地方的i<j和上面的while循环里面的条件相重复了,因为while循环反复判断括号里面的条件,反复在执行j--;说不定什么时候j减到小于i了也不一定啊。

j--;

if(i < j)

{

s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑

i++;

}

// 从左向右找大于或等于x的数来填s[j]

while(i < j && s[i] < x)

i++;

if(i < j)

{

s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑

j--;

}

}

//退出时,i等于j。将x填到这个坑中。

s[i] = x;

return i;

}

//这个函数的核心就是在一个子数组里面(可能是左边的,也可能是右边的)得出基准元素最终的下标,进行下一步的迭代。思想是一第一个数为基准元素,将其保存在x里面,形成一个坑,从后往前找比基准元素小的填这个坑,新形成的坑怎么办呢,从前往后找比基准元素大的填坑,(这样做的目的是前面的元素肯定是比x小的,后面的元素肯定是比x大的)这样不断地进行,直到i=j为止,此时最后的坑由x去填,即最初的基准元素。

void quick_sort1(int s[], int l, int r)

{

if (l < r)

{

int i = AdjustArray(s, l, r);//先成挖坑填数法调整s[]

quick_sort1(s, l, i - 1); // 递归调用

quick_sort1(s, i + 1, r);

}

}

adjustArray函数返回了一个值,这个值记录了一次排序后基准元素的下标,记为i,则i+1是子数组的最左边的元素(这个数组所有的元素都比这个基准元素大),i-1是子数组的最右端(这个数组所有的元素都比这个基本数组小)。递归之后就得到排好的顺序了。

参考博客:http://blog.csdn.net/morewindows/article/details/6684558
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: