快速排序
2014-03-11 22:15
127 查看
算法思想:
算法在数组中选择一个称为主元(pivot)的元素,将数组分为两个子数组,使得第一个子数组的所有元素都小于或等于主元,二第二个子数组中的所有元素都大于主元。然后对第一子数组递归调用快速排序算法,然后对第二子数组递归调用快速排序算法。
/article/5145988.html
package introjava;
public class QuickSort2 {
/**
* description : 快速排序
* @autor kwzhang
* modify :2012-6-20
*
* @param pData
* @param left
* @param right
* @return
*/
public static void quickSort(int [] list)
{
quickSort(list, 0, list.length - 1);
}
static void quickSort(int n[], int left, int right) {
int dp;
if (left < right) {
dp = partition(n, left, right);
quickSort(n, left, dp - 1);
quickSort(n, dp + 1, right);
}
}
static int partition(int n[], int left, int right) {
int pivot = n[left];
while (left < right) {
while (left < right && n[right] >= pivot) //元素比pivot大继续,小就停
right--;
if (left < right)
n[left++] = n[right]; //将n[left]赋值为n[right],n[left]已经存在pivot里,然后left自增
while (left < right && n[left] <= pivot) //元素比pivot小继续,大就停
left++;
if (left < right) //将n[right]赋值为n[left],这样完成n[left]和n[right]的交换,然后各自自增或自减,并返回当做下轮的pivot位置。
n[right--] = n[left];
}
n[left] = pivot; //改成n[right] = pivot;结果也是对的,因为这是left和right是在同一个位置。
return right; //改成left也是对的
}
public static void main(String []args){
int [] list = {1,2,3,4,5,6};
// int [] list = {5, 2, 9, 3, 8, 4, 5, 5, 0, 1, 6, 7};
for(int i = 0; i < list.length; i++)
System.out.print(list[i] + " ");
System.out.print("\n");
quickSort(list);
for(int i = 0; i < list.length; i++)
System.out.print(list[i] + " ");
}
}
PS: 觉得这个方法比较简单。
另外一点需要注意:
while (left < right && n[right] >= pivot)
right--;
和
while (left < right && n[right--] >= pivot);
是不一样的,--的优先级比[]要高,所以上面如果right值为10,则n[right]为n[10],而下面是n[9]!!!所以本想用下面这句代码,显得高端结果出错了。囧~~
算法在数组中选择一个称为主元(pivot)的元素,将数组分为两个子数组,使得第一个子数组的所有元素都小于或等于主元,二第二个子数组中的所有元素都大于主元。然后对第一子数组递归调用快速排序算法,然后对第二子数组递归调用快速排序算法。
/article/5145988.html
package introjava;
public class QuickSort2 {
/**
* description : 快速排序
* @autor kwzhang
* modify :2012-6-20
*
* @param pData
* @param left
* @param right
* @return
*/
public static void quickSort(int [] list)
{
quickSort(list, 0, list.length - 1);
}
static void quickSort(int n[], int left, int right) {
int dp;
if (left < right) {
dp = partition(n, left, right);
quickSort(n, left, dp - 1);
quickSort(n, dp + 1, right);
}
}
static int partition(int n[], int left, int right) {
int pivot = n[left];
while (left < right) {
while (left < right && n[right] >= pivot) //元素比pivot大继续,小就停
right--;
if (left < right)
n[left++] = n[right]; //将n[left]赋值为n[right],n[left]已经存在pivot里,然后left自增
while (left < right && n[left] <= pivot) //元素比pivot小继续,大就停
left++;
if (left < right) //将n[right]赋值为n[left],这样完成n[left]和n[right]的交换,然后各自自增或自减,并返回当做下轮的pivot位置。
n[right--] = n[left];
}
n[left] = pivot; //改成n[right] = pivot;结果也是对的,因为这是left和right是在同一个位置。
return right; //改成left也是对的
}
public static void main(String []args){
int [] list = {1,2,3,4,5,6};
// int [] list = {5, 2, 9, 3, 8, 4, 5, 5, 0, 1, 6, 7};
for(int i = 0; i < list.length; i++)
System.out.print(list[i] + " ");
System.out.print("\n");
quickSort(list);
for(int i = 0; i < list.length; i++)
System.out.print(list[i] + " ");
}
}
PS: 觉得这个方法比较简单。
另外一点需要注意:
while (left < right && n[right] >= pivot)
right--;
和
while (left < right && n[right--] >= pivot);
是不一样的,--的优先级比[]要高,所以上面如果right值为10,则n[right]为n[10],而下面是n[9]!!!所以本想用下面这句代码,显得高端结果出错了。囧~~
相关文章推荐
- 文件的读写
- 学籍管理系统
- Xcode 5.1发布说明以及iOS 7.1发布
- mongodb基本使用2
- 出现( linker command failed with exit code 1)错误总结
- VLC视频播放器开发--VLC for Android编译
- 名称解析
- ISAPI_Rewrite中文手册
- 学籍管理系统
- 堆与栈的区别
- java 克隆函数
- live555 client 接收rtp数据
- Image转化成Base64字符串再转回Image
- DWR与SSH 配置
- 线程封闭
- 对Servlet及tomcat关系的理解,以及Action与servletAPI的关系,以及httpServletRequest
- github上最火的android开源项目
- QTP问题一
- Pow(x, n)
- 今天特别忙