快速排序 非递归 java_快速排序的递归与非递归实现

importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Stack;publicclassQSort {/***@authorWangYu 2008-05-29 初始

*@parampData

*            需要排序的数组

*@paramleft

*            左边的位置,初始值为0

*@paramlength

*            右边的位置,初始值为数组长度*/publicstaticvoidquickSort(int[] pData,intleft,intright) {inti, j;intmiddle, temp;

i=left;

j=right;

middle=pData[left];while(true) {while((++i)

;while((--j)>left&&pData[j]>middle)

;if(i>=j)break;

temp=pData[i];

pData[i]=pData[j];

pData[j]=temp;

}

pData[left]=pData[j];

pData[j]=middle;

System.out.print("分界值:"+middle+"下标"+j+":");for(intk=0; k

System.out.print(pData[k]+"");

}

System.out.println();if(left

quickSort(pData, left, j);if(right>i)

quickSort(pData, i, right);

}/***@authorardorleo 2010-11-21 快速排序优化后的递归实现

*@parampData

*            需要排序的数组

*@paramleft

*            左边的位置,初始值为0

*@paramlength

*            右边的位置,初始值为数组长度*/publicstaticvoidqSort1(int[] pData,intleft,intlength) {inti, j;intmiddle, temp;

i=left;

j=length;

middle=pData[left];while(true) {//在循环体中,middle只用做比较,但值保持不变while((++i)

;while((--j)>left&&pData[j]>middle)

;if(i>=j)break;

temp=pData[i];

pData[i]=pData[j];

pData[j]=temp;

}//较小的值在左,较大的值右pData[left]=pData[j];

pData[j]=middle;

System.out.print("分界值:"+middle+"下标"+j+":");for(intk=0; k

System.out.print(pData[k]+"");

}

System.out.println();//此种条件可以避免多余排序(每一趟最后两个相邻已比较后,就不用再递归了)if(j-left>1)

qSort1(pData, left, j);if(length-i>1)

qSort1(pData, i, length);

}/***@authorardorleo 2010-11-21 快速排序的非递归实现

*@parampData

*            需要排序的数组

*@paramleft

*            左边的位置,初始值为0

*@paramlength

*            右边的位置,初始值为数组长度*/publicstaticvoidqsort2(int[] pData,intorignal_start,intorignal_length) {inttemp;intstart=orignal_start;intlength=orignal_length;intleft=orignal_start;intright=orignal_length;intreference=pData[left];

StackintStack=newStack();while(true) {while(true) {while((++left)

;while((--right)>start&&pData[right]>reference)

;if(left>=right)break;

temp=pData[left];

pData[left]=pData[right];

pData[right]=temp;

}

pData[start]=pData[right];

pData[right]=reference;

System.out.print("分界值:"+reference+"下标:"+right+"当前顺序:");for(intk=0; k

System.out.print(pData[k]+"");

}

System.out.println();//分值左边排序if(right>start+1) {

intStack.push(length);

length=right;

left=start;

}//分值右边排序while(length<=left+1&&!intStack.empty()) {inttempLength=intStack.pop();

left=length+1;

length=tempLength;

}if(length>left+1) {

start=left;

right=length;

}//结束条件if(intStack.empty()&&length<=left+1)break;//left值有可能大于下标最大值reference=pData[left];

}

}publicstaticvoidmain(String[] args) {int[] pData=newint[10];for(inti=0; i<10; i++) {

pData[i]=(int) (Math.random()*100);

}

System.out.print("数组原始序列:");for(inti=0; i

System.out.print(pData[i]+"");

System.out.println("\n***********************");

QSort.qsort2(Arrays.copyOf(pData, pData.length),0, pData.length);

System.out.println("***********************");

QSort.qSort1(Arrays.copyOf(pData, pData.length),0, pData.length);

System.out.println("***********************");

QSort.quickSort(Arrays.copyOf(pData, pData.length),0, pData.length);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值