快速排序

来源:互联网 发布:mac 大容量网盘 编辑:程序博客网 时间:2024/06/10 16:39

最近手写了一下快速排序,现将自己的理解和在调试程序过程中遇到的一些问题总结一下以供参考(新手入学,高手勿喷)

先上代码:

import java.io.*;import java.util.Scanner;public class QuickSort {int temp;//temp为基数值int i;//左边哨兵int j;//右边哨兵int[]save;QuickSort(int[]save){this.save=save;}    public void quickSort(int left,int right){        i=left;        j=right;        if(left>right)//当left>right是说明在基数值的右边找不到大于基数值得数,在基数值的右边找不到小于基数值的数,应当结束查找        return;        temp=save[i];//先以左边第一个数为基数值    //先从左边的哨兵开始遍历找小于temp的数    while(i!=j){    while(temp<=save[j]&&j>i){    j--;    }    //再从右边开始遍历找到大于temp的值    while(temp>=save[i]&&j>i){    i++;    }    //交换位置    if(j>i){    int t;    t=save[i];    save[i]=save[j];    save[j]=t;    }        }    save[left]=save[i];    save[i]=temp;    quickSort(left,i-1);    quickSort(i+1,right);//j+1 error    }    public void print(){    for(int k=0;k<=save.length-1;k++){    System.out.print(save[k]+" ");    }    }    public static void main(String[] args){    int[] save={6,5,7,6,2,3,1};    QuickSort quickSort=new QuickSort(save);    quickSort.quickSort(0,6);    quickSort.print();    }}

快速排序的基本思路就是每次将选定的基准数归位,一下是在写代码时自己遇到的一些错误:

1.

if(left>right)//当left>right是说明在基数值的右边找不到大于基数值得数,在基数值的右边找不到小于基数值的数,应当结束查找        return;
temp=save[i];//先以左边第一个数为基数值
以上两个语句是不能调换位置的,否则将会抛出抛出数组越界的错误,原因分析如下:

当程序在递归调用时,i是处于自加状态的,所以一定会增加到最后一个数(也就是说每个数都有可能成为基数),所以当到数组的最后一个数时还不结束的话将会导致数组越界。

2.

quickSort(i+1,right);//j+1 error
该语句中的i是不能改成j的,如果改成j将会成为一个死循环