快速排序个人见解

1.快速排序
快速排序原理:这里我们结合例子来讲。
比如现在有一个数组A,我们要对数组A中的数字进行排序。

Integer []A=new Integer []{27,38,13,49,76,97,65};

我们把数组中的第一个元素看为中轴作为分界线(中轴左边的就是小的数,右边就是大的数),然后和最后一个元素开始去比较大小,如果最后这个数的数值比它小,就交换两个数的位置。比它大的话不做任何处理(继续从右往左去比较)。交换位置之后,再去和小的那端从右往左比,比它小的不做任何处理,比它大的交换位置。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,接下来再分别对这两个独立的数组进行排序。

过程:

27 38 13 49 76 97 65
13 38 27 49 76 97 65 //第一次交换
13 27 38 49 76 97 65 //第二次交换

上面这个例子我们可以清楚地看到交换到最后得到了我们想要的结果,中轴左边的数值比它本身小,右边的数值比它本身大。

利用分治法编码实现对数组进行排序 方式一:

/**
* 首先写一个获取中轴位置的方法
* @param list
* @param left
* @param right
* @return
*/
public int getMiddle(Integer [] list,int left,int right){
int temp=list[left]; //把数组的第一个元素作为中轴
while(left<right){
while(left<right&&list[right]>temp){
right--;
}
list[left]=list[right]; //比中轴小的记录移到低端
while(left<right&&list[left]<temp){
left++;
}
list[right]=list[left]; //比中轴大的记录移到高端
}
list[left]=temp; //中轴记录到尾
return left; //返回中轴的位置
}


/**
* 递归形式的分治排序算法:
* @param list
* @param left
* @param right
*/
public void _quickSort(Integer[] list, int left, int right) {
if (left < right) {
int middle = getMiddle(list, left, right); //将list数组进行一分为二
_quickSort(list, left, middle - 1); //对低字表进行递归排序
_quickSort(list, middle + 1, right); //对高字表进行递归排序
}
}

/**当数组有两个以上元素时才排序
* @param str
*/
public void quick(Integer[] str) {
if (str.length > 0) { //查看数组是否为空
_quickSort(str, 0, str.length - 1);
}
}

/**
* 编写测试方法:
* 打印结果:13 27 38 49 65 76 97
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer[] list={27,38,13,49,76,97,65};
Sort qs=new Sort();
qs.quick(list);
for(int i=0;i<list.length;i++){
System.out.print(list[i]+" ");
}
System.out.println();
}


方式二:

/**
* 通过中轴快速排序
* @param strDate
* @param left
* @param right
*/
public void quickSort(String[] strDate,int left,int right){
String middle,tempDate;
int i,j;
i=left;
j=right;
middle=strDate[(i+j)/2];
do{
while(strDate[i].compareTo(middle)<0&& i<right){
i++; //找出左边比中间值大的数,从左往右
}
while(strDate[j].compareTo(middle)>0&& j>left){
j--; //找出右边比中间值小的数,从右往左。
}
if(i<=j){ //将左边大的数和右边小的数进行替换
tempDate=strDate[i];
strDate[i]=strDate[j];
strDate[j]=tempDate;
i++;
j--;
}
}while(i<=j); //当两者交错时停止

if(i<right){
quickSort(strDate,i,right);//对中轴左边的数组进行排序
}
if(j>left){
quickSort(strDate,left,j);//对中轴右边的数组进行排序
}
}

/**
* 测试方法
* @param args
*/
public static void main(String[] args) {
String[] str=new String[]{"27","38","13","49","76","97","65"};
QuicklySort sort=new QuicklySort();
sort.quickSort(str, 0, str.length-1);
for(int i=0;i<=str.length-1;i++){
System.out.println(str[i]);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值