复杂排序

package suanfa.newchllenage;

import java.util.Arrays;

/**
 * 随机版快速排序
 */
public class QuickSort02 {

    public static void quickSort(int [] a){
        if (a==null||a.length<1){
            return;
        }
        quickSortSore(a,0,a.length-1);
    }

    private static void quickSortSore(int [] a,int start,int end){
        if (start<end){
            int mid=partition(a,start,end);
            if (mid-1>start){
                quickSortSore(a,start,mid-1);
            }
            if (mid+1<end){
                quickSortSore(a,mid+1,end);
            }
        }
    }


    private static int partition(int [] a,int start,int end){
        int randIndex=(int)(Math.random()*(end-start+1)+start);
        int pivot=a[randIndex];
        int left=start;
        int right=end;

        System.out.println(left+"----"+randIndex+"-----"+right);

        while (true){

            while (a[left]<=pivot){
                left++;
                if (left==right){
                    break;
                }
            }

            while (a[right]>pivot){
                right--;
                if (left==right){
                    break;
                }
            }

            if (left>=right){
                break;
            }

            int t=a[left];
            a[left]=a[right];
            a[right]=t;
        }

        int t=a[randIndex];
        a[randIndex]=a[right];
        a[right]=t;
        System.out.println(Arrays.toString(a));
        return right;
    }

    public static void main(String[] args) {
        int [] a={3,2,5,8,4,7,6,9,1};
        quickSort(a);
        System.out.println(Arrays.toString(a));
    }
}

package suanfa.newchllenage;

import java.util.Arrays;

public class HeapSort {

    private static class BTNode{
        int data;
        BTNode left;
        BTNode right;
    }

    public static void heapSort(int [] a){
        BTNode [] q=new BTNode[a.length];
        int front,rear;
        front=rear=-1;
        BTNode root,pa;
        pa=root=new BTNode();
        root.data=a[0];

        //  用数组模拟队列,建立完全二叉树并记录在队列中的位置,供后面进行堆排序
        q[++rear]=root;
        ++front;
        for (int i=1;i<a.length;i++){
           BTNode p=new BTNode();
           p.data=a[i];
           q[++rear]=p;
           if (pa.left==null){
               pa.left=p;
           }else {
               pa.right=p;
               pa=q[++front];
           }
        }

        //  要把rear放在最后一个非叶子节点上,所以在这里进行判断,因为都是双分支时,会跑到第一个叶子节点上
        //  当数组长度为1时,会直接进行最后的a[index++]=q[0].data操作
        if (q[front].left==null&&q[front].right==null){
            front--;
        }

        //  进行堆排序
        int index=0;

        while (front>-1){

            boolean tag=true;
            while (tag){
                tag=false;
                //  当每个非叶子节点调整后都未进行交换,证明该次将最小值放在根节点完成
                for (int j=front;j>-1;j--){
                    BTNode p,pmin;
                    p=pmin=q[j];
                    if (p.left.data<pmin.data){
                        pmin=p.left;
                    }
                    if (p.right!=null&&p.right.data<pmin.data){
                        pmin=p.right;
                    }
                    if (pmin!=p){
                        tag=true;
                        int t=p.data;
                        p.data=pmin.data;
                        pmin.data=t;
                    }
                }
            }

            //  经过调整,最小已经在根节点,此时将根节点与最后一个叶子的值进行替换,并删掉最后一个叶子
            BTNode p=q[rear];
            a[index++]=root.data;
            int t=p.data;
            p.data=root.data;
            root.data=t;
            rear--;

            //  front所在位置是rear对应的父节点
            if (q[front].right!=null){
                q[front].right=null;
            }else {
                q[front].left=null;
                front--;
            }
        }

        //***********************
        //  上次调整已经成一个根节点与一个左节点时,本次在进行上的一次调整后,选出一个最小之后,front--
        //  front的值就成了-1了,此时二叉树上还有一个根节点
       a[index++]=q[0].data;
    }

    static void print(BTNode root){
        if (root!=null){
            System.out.print(root.data+" ");
            print(root.left);
            print(root.right);
        }
    }

    public static void main(String[] args) {
        int [] a={3,2,5,8,4,7,6,9,1};
        int [] a2={1};
        heapSort(a2);

        System.out.println(Arrays.toString(a2));
    }
}

package suanfa.newchllenage;

import java.util.Arrays;

public class Sort02 {

    //  希尔排序
    public static void shellSort(int [] a){
        if (a==null||a.length<1){
            throw new RuntimeException("input data is error");
        }
        if (a.length==1){
            return;
        }

        int dis=a.length;
        do {
            dis=dis/3+1;
            System.out.println(dis);
            for (int i=dis;i<a.length;i+=dis){
                int temp=a[i];
                int j;
                for (j=i-dis;j>-1&&temp<a[j];j-=dis){
                    a[j+dis]=a[j];
                }
                a[j+dis]=temp;
            }
        }while (dis!=1);
    }

    //  计数排序
    public static void countingSort(int [] a){
        if (a==null||a.length<1){
            throw new RuntimeException("input data is error");
        }
        if (a.length==1){
            return;
        }
        int min,max;
        min=max=a[0];
        for (int i=1;i<a.length;i++){
            if (a[i]<min){
                min=a[i];
            }
            if (a[i]>max){
                max=a[i];
            }
        }

        int [] count=new int[max-min+1];
        for (int i=0;i<a.length;i++){
            int index=a[i]-min;
            count[index]++;
        }

        int index=0;
        for (int i=0;i<count.length;i++){
            while (count[i]-->0){
                a[index++]=i+min;
            }
        }
    }



    public static void main(String[] args) {
        int [] a={3,2,5,8,4,12,6,9,2};
        int [] a2={3,0};
        //shellSort(a2);
        countingSort(a);
        System.out.println(Arrays.toString(a));
    }
}

package suanfa.newchllenage;

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;

/**
 * 仅用一个栈来辅助另一个栈进行排序
 */

public class StackSort {

    public static void stackSort(Deque<Integer> stack){
        Deque<Integer> help=new ArrayDeque<>();

        while (!stack.isEmpty()){
            int temp=stack.pop();
           if (!help.isEmpty()&&temp>=help.peek()){
               while (!help.isEmpty()&&temp>help.peek()){
                   stack.push(help.pop());
               }
           }
            help.push(temp);
        }
        while (!help.isEmpty()){
            stack.push(help.pop());
        }
    }
    public static void main(String[] args) {
        int [] data={3,2,5,8,4,7,6,9,1};
        Deque<Integer> stack=new ArrayDeque<>();
        for (int i : data){
            stack.push(i);
        }
        System.out.println("sort before :"+ Arrays.toString(data));
        stackSort(stack);
        System.out.println("sort after :");
        for (int  i : stack){
            System.out.print(stack.pop()+"   ");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值