快速排序

来源:互联网 发布:加盟农村淘宝怎么盈利 编辑:程序博客网 时间:2024/06/05 17:06
快速排序的两种方式,递归和非递归,非递归使用栈
public class QuickSort {//排序public void quickSort(int A[],int p,int r){if (p<r) {int q=randomPartition(A, p, r);//System.out.println(q);quickSort(A, p, q-1);quickSort(A, q+1, r);}}public int randomPartition(int A[],int p,int r){//选择随机数是一个坑爹的存在,还不如直接选定x=A[r]效率高//int i= (int) (Math.random()*(r - p)+p);//int tmp=A[r];//A[r]=A[i];//A[i]=tmp;return partition(A, p, r);}//划分public int partition(int A[],int p,int r){int x=A[r];int i=p-1;int tmp=0;for (int j = p; j < r; j++) {if (A[j]<=x) {i=i+1;tmp=A[i];A[i]=A[j];A[j]=tmp;}}tmp=A[i+1];A[i+1]=A[r];A[r]=tmp;return i+1;}public int[] randomArray(int n){int A[]=new int[n];for (int i = 0; i < n; i++) {A[i]=(int) (Math.random()*100000);}return A;}public static void main(String[] args) {QuickSort quickSort=new QuickSort();int A[]=quickSort.randomArray(50000);long startTime=System.nanoTime();quickSort.quickSort(A, 0, A.length-1);long endTime=System.nanoTime();System.out.println(endTime-startTime);//for(int i:A)//{//System.out.println(i);//}}}
import java.util.Stack;//快速排序的非递归实现,利用系统的栈stackpublic class QuickSortNonRecursion {     public static void main(String[] args) {         QuickSortNonRecursion qsnr = new QuickSortNonRecursion();         int[] array = {0, 2, 11, 121, 18, 99, 3, 5, 101, 22, 9, 100};         qsnr.quicksort(array);          for (int i : array) {                System.out.print(i + "  ");          }        }                         public void quicksort(int[] array) {            if (array == null || array.length == 1) return;            //存放开始与结束索引            Stack<Integer> s = new Stack<Integer>();             //压栈                   s.push(0);             s.push(array.length - 1);             //利用循环里实现            while (!s.empty()) {                 int right = s.pop();                 int left = s.pop();                 //如果最大索引小于等于左边索引,说明结束了                if (right <= left) continue;                                          int i = partition(array, left, right);                 if (left < i - 1) {                    s.push(left);                    s.push(i - 1);                }                 if (i + 1 < right) {                    s.push(i+1);                    s.push(right);                }            }         }        //找到轴心,进行交换        public int partition (int[] data, int first, int end)        {            int temp;            int i=first,j=end;            if(first<end)            {                temp=data[i];                //当i=j的时候,则说明扫描完成了                while(i<j)                {                    //从右边向左边扫描找到一个小于temp的元素                    while(j>i&&data[j]>temp)j--;                    if(i<j)                    {                        //将该元素赋值给temp                        data[i]=data[j];                        //赋值后就应该将i+1指向下一个序号                        i++;                    }                                               //然后从左边向右边开始扫描,找到一个大于temp的元素                    while(i<j&&temp>data[i])i++;                    if(i<j)                    {                        //将该元素赋值给temp                        data[j]=data[i];                        //赋值后就应该将j-1指向前一个序号                        j--;                    }                }                //将轴数据放在i位置中                data[i]=temp;            }            return i;        }    }


0 0
原创粉丝点击