码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序实现(quickSort)

时间:2019-09-25 00:25:06      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:复习   void   栈溢出   第一个   初始化   标记   溢出   new   pack   

今天复习数据结构,看到了快速排序算法,期间遇到了一点小问题为了以后避免出现在类似的问题,所以写了博记录一下。

首先掌握住快速排序算法的思想,以(6,1,2,7,9,3,4,5,10,8)为例。

int[] myarr = new int[] {6,1,2,7,9,3,4,5,10,8};

 

技术图片

 

 

 首先需要选取一个标准基数,为了方便我们选取第一个数作为基数。定义两个变量 i 和 j 表示两个标记。起初我们为为这两个变量赋初始值。i =  beginIndex +1 (以为基数不需要和本身进行对比,所以i为开始位置索引加一),j = endIndex (j就是结束位置的索引)

 

然后从j开始操作,首先myarr[j] 与 myarr[beginIndex]进行比较,如果比开始位置大那么j--继续移动,反之如果比开始位置小那么就停止移动。

接着去操作i,首先让myarr[i] 与 myarr[beginIndex]进行比较,如果比开始位置小那么i++ 继续往前移动,反之如果比开始位置大那么停止移动。

然后将i 和 j 所对应的值进行互换。 接着重复上述操作

技术图片

 

技术图片

 

 

直到i > j,就停止上述操作。跳出循环的时候如果i和j 相等 并且指向的值小于基数,那么我们就将基数和i和j指向的值进行互换,这样就可以更换了基数。

 

 

 经过上述操作,数组被我们分为了两部分。其中一部分是小于基数的,另一部分是大于基数的。这时候就用到了递归的思想,我们利用递归分别去对小于基数的部分和大于基数的的部分进行快速排序。

 

在调用本身方法的时候,需要进行一个判断(如果某一次排序使得序列有序,那么必然会出现左边子数组或者右边子数组为空,这样就会出现错误。)

判断的添加就比较简单(quicSort()是实现快速排序的函数)


if(j-1 > beginIndex) {
quickSort(myarr, beginIndex, j-1);
}


if(i+1< endIndex) {
quickSort(myarr, i+1, endIndex);
}

 

这样下来就可以保证快速排序正常的进行。下面我将我写的代码贴出来

/**
* @author RenJian
*/
package demo;
import java.util.Arrays;

 

 

public class TestQuickSort {

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] myarr = new int[] {6,1,2,7,9,3,4,5,10,8};
System.out.println(Arrays.toString(myarr));
quickSort(myarr, 0, myarr.length-1);
System.out.println(Arrays.toString(myarr));
}

//快速排序
public static void quickSort(int[] myarr, int beginIndex, int endIndex) {
int len = myarr.length;
//初始化变量
int standard = myarr[beginIndex],i = beginIndex+1,j = endIndex;
while(i < j){
while((i < j) && (myarr[j] > myarr[beginIndex])){
j --;
}

while((i < j) && (myarr[i]< myarr[beginIndex])) {
i++;
}
if(i<j) {
int temp =myarr[i];
myarr[i] = myarr[j];
myarr[j] = temp;
}

}
if(myarr[i] < myarr[beginIndex]) {
int t = myarr[beginIndex];
myarr[beginIndex] = myarr[i];
myarr[i] = t;
}
System.out.println(Arrays.toString(myarr)); //为了查看每一次快速排序的结果

if(j-1 > beginIndex) {
quickSort(myarr, beginIndex, j-1);
}


if(i+1< endIndex) {
quickSort(myarr, i+1, endIndex);
}





}

}

在编写的过程中,有一次在递归的时候没有写判断并且出现了一个错误,错误信息为:java.lang.StackOverflowError  了解到这个错误信息是递归调用出现,导致堆栈溢出。

快速排序实现(quickSort)

标签:复习   void   栈溢出   第一个   初始化   标记   溢出   new   pack   

原文地址:https://www.cnblogs.com/RenJian666/p/11581952.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!