排序算法

目录

  1. 选择排序
  2. 插入排序
  3. 冒泡排序
  4. 归并排序
  5. 快速排序
  6. 希尔排序
  7. 堆排序
  8. 计数排序
  9. 桶排序
  10. 基数排序

1.SelectRanking原理

 

SelectRanking-java代码 

public class SelectRanking {
    public static void select(int[] a){
        int i,j;
        int tmp = 0, flag = 0;
        int n = a.length;
        for(i=0;i<n;i++){
            tmp = a[i];
            flag = i;
            for(j=i+1;j<n;j++){
                if(a[j]<tmp){
                    tmp = a[j];
                    flag = j;
                }
            }
            if(flag!=i){
                a[flag] = a[i];
                a[i] = tmp;
            }
        }
    }
    
    public static void main(String[] args){
        int a[] = {1,7,7,8,4,4,5,8,0,8,3};
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println("\n选择排序:");
        select(a);
        
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println("\n");
        
        System.out.println("请输入几个数并用逗号隔开:");
        Scanner sc = new Scanner(System.in);
        String str = sc.next().toString();
        String[] arr  = str.split(",");
        int[] b = new int[arr.length];
        for(int i=0;i<b.length;i++){
            b[i] = Integer.parseInt(arr[i]);
            System.out.print(b[i]+" ");
        }
        System.out.println("\n");
    }

}

 

2.InsertRanking原理

 

InsertRanking-java代码

public class InsertRanking {
    public static void Insert(int[] a){
        if(a!=null){
            for(int i=1;i<a.length;i++){
                int tmp=a[i],j=i;
                if(a[j-1]>tmp){
                    while(j>=1&&a[j-1]>tmp){
                        a[j]=a[j-1];
                        j--;
                    }
                }
                a[j]=tmp;
            }
        }
    }
    public static void main(String[] args){
        int a[] = {1,7,9,8,4,4,5,8,0,8,3};
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println("\n插入排序:");
        Insert(a);
        
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
    }

}

 

3.BubbleRanking原理

 

BubbleRanking-java代码

public class BubbleRanking {
    public static void Bubble(int[] a){
        int i,j;
        int tmp;
        for(i=0;i<(a.length-1);i++){
            for(j=(a.length-1);j>i;--j){
                if(a[j]<a[j-1]){
                    tmp = a[j];
                    a[j] = a[j-1];
                    a[j-1] = tmp;
                }
            }
        }
    }
    
    public static void main(String[] args){
        int a[] = {1,7,7,8,4,4,5,8,0,8,3};
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
        System.out.println("\n冒泡排序:");
        Bubble(a);
        
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
    }

}

 

4.MergeRanking原理

 

MergeRanking-java代码

public class MergeRanking {
    public static void main(String [] args){
        
        Scanner in=new Scanner(System.in);
        
        System.out.println("请输入数组的大小");
        
        int N=in.nextInt();//从键盘读取数组的大小。
        
        int A[]=new int [N];
        
        System.out.println("请输入数组中的数");
        
        for(int i=0;i<N;i++){//一次从键盘中读取输入的数。
            
            A[i]=in.nextInt();
        }
        mergeSort(A,0,N-1);//调用归并函数。
        
        System.out.println("按从小到大的顺序归并排序后为:");
        
        for(int m=0;m<N;m++){
            
            System.out.print(A[m]+" ");
        }
    }
public static void     mergeSort(int A[],int p,int r){//归并函数的代码。
    
        if(p<r){
            
            int q=(p+r)/2;
            
            mergeSort(A,p,q);
            
            mergeSort(A,q+1,r);
            
            merge(A,p,q,r);
            
        }
    }
public static void merge(int A[],int p,int q,int r){//将两个有序的数组进行归并的代码。
    
    int L[]=new int[q-p+1];
    
    int R[]=new int[r-q];
    
    int k,j;
    
    for( k=0;k<=q-p;k++){
        
        L[k]=A[p+k];
    }
    for(j=0;j<r-q;j++){
        
        R[j]=A[q+1+j];
    }/*将A数组从A[p]到A[r]经A[q]划分成两部分并存储在两个新数组中.
    由于在mergeSort函数中经递归到最底层时只剩下由两个长度为1的数组数,所以这两个数组必然有序,
    所以往回调用时A[p~q]和A[q+1~r]也必然是两个有序的数组。*/
    k=0;
    
    j=0;
    for(int i=p;i<=r;i++){/*将两个数组比较大小往A[]中添加时还要分成两个部分添加。因为k和j总是在不定期的加1,而且A[]比两个数组都要大
        所以要识别两个小数组是否越界*/
        if(k<=q-p&&j<=r-q-1){//第一个部分:非越界部分怎样添加。
            
            if(L[k]<R[j]){
                
              A[i]=L[k];
              
              k++;
              }
            else {
                
              A[i]=R[j];
              
              j++;        
        }
    }
        else{//第二部分:其中某个数组越界后,另一个数组中未添加的数一定比A[]中已经添加的数要大且有序,所以直接往后添加。
            
            if(k>q-p){//L[]先越界,直接往A[]后添加R[]没有添加的部分。
                
                A[i]=R[j];
                
                j++;
                
            }
            else{//R[]先越界,直接往A[]后添加L[]没有添加的部分。
                
                A[i]=L[k];
                
                k++;
            }
        }
          }
     }

}

 

5.quickranking原理

 

quickranking-java代码

public class quickranking {
    public static void sort(int array[],int low,int high){
        int i,j;
        int index;
        if(low>=high)
            return;
        i=low;
        j=high;
        index=array[i];
        while(i<j){
            while(i<j&&array[j]>=index)
                j--;
            if(i<j){
                array[i]=array[j];
                i++;
            }
            while(i<j&&array[i]<index)
                i++;
            if(i<j)
                array[j--]=array[i];
        }
        array[i]=index;
        sort(array,low,i-1);
        sort(array,i+1,high);
    }
    
    public static void quickSort(int array[]){
        sort(array,0,array.length-1);
    }
    
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);        
        System.out.println("请输入数组的大小");        
        int N=in.nextInt();//从键盘读取数组的大小。        
        int A[]=new int [N];        
        System.out.println("请输入数组中的数");        
        for(int i=0;i<N;i++){//一次从键盘中读取输入的数。            
            A[i]=in.nextInt();
        }
        
        quickSort(A);        
        System.out.println("按从小到大排序后为:");        
        for(int m=0;m<N;m++){            
            System.out.print(A[m]+" ");
        }
    }
}

 

6.shellranking原理

 

shellranking-Java代码

public class shellranking {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);        
        System.out.println("请输入数组的大小");        
        int N=in.nextInt();//从键盘读取数组的大小。        
        int A[]=new int [N];        
        System.out.println("请输入数组中的数");        
        for(int i=0;i<N;i++){//一次从键盘中读取输入的数。            
            A[i]=in.nextInt();
        }
        
        shellSort(A);        
        System.out.println("按从小到大排序后为:");        
        for(int m=0;m<N;m++){            
            System.out.print(A[m]+" ");
        }
    }
    
    public static void shellSort(int array[]){
        int length = array.length;
        int i,j,h,tmp;
        for(h=length/2;h>0;h=h/2){
            for(i=h;i<length;i++){
                tmp = array[i];
                for(j=i-h;j>=0;j-=h){
                    if(tmp<array[j]){
                        array[j+h] = array[j];
                    }
                    else
                        break;
                }
                array[j+h] = tmp;
            }
        }
    }
}

 

7.heapranking原理

 

heapranking-Java代码

public class heapranking {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);        
        System.out.println("请输入数组的大小");        
        int N=in.nextInt();//从键盘读取数组的大小。        
        double A[]=new double [N];        
        System.out.println("请输入数组中的数");        
        for(int i=0;i<N;i++){//一次从键盘中读取输入的数。            
            A[i]=in.nextDouble();
        }
        //a sample input
        System.out.println("Input: " + Arrays.toString(A));
        heapranking maxhp = new heapranking();
        maxhp.heapsort(A);
        System.out.println("Output: " + Arrays.toString(A));
    }
    protected double A[];
    protected int heapsize;
    protected int parent(int i) {return (i - 1) / 2;}
    protected int left(int i) {return 2 * i + 1;}
    protected int right(int i) {return 2 * i + 2;}

    //constructors
    public heapranking(){}
    public heapranking(double A[]){
        buildMaxHeap(A);
    }    

    protected void maxHeapify(int i){
        int l = left(i);
        int r = right(i);
        int largest = i;
        if (l <= heapsize - 1 && A[l] > A[i])
            largest = l;
        if (r <= heapsize - 1 && A[r] > A[largest])
            largest = r;
        if (largest != i) {
            double temp = A[i];
            // swap
            A[i] = A[largest];
            A[largest] = temp;
            this.maxHeapify(largest);
        }
    }
    
    public void buildMaxHeap(double [] A){
        this.A = A;
        this.heapsize = A.length;
        
        for (int i = parent(heapsize - 1); i >= 0; i--)
            maxHeapify(i);        
    }
    
    public void heapsort(double [] A){
        buildMaxHeap(A);
        
//        int step = 1;
        for (int i = A.length - 1; i > 0; i--) {
            double temp = A[i];
            A[i] = A[0];
            A[0] = temp;
            heapsize--;
//            System.out.println("Step: " + (step++) + Arrays.toString(A));
            maxHeapify(0);
        }        
    }
}

 

8.计数排序

countranking原理

 

countranking-Java代码

import java.util.*;

public class countranking {
    public static int[] countSort(int[] array) {
        if (array.length == 0)
            return array;
        int bias, min = array[0], max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i] > max)
                max = array[i];
            if (array[i] < min)
                min = array[i];
        }
        bias = 0 - min;
        int[] bucket = new int[max - min + 1];
        Arrays.fill(bucket, 0);
        for (int i = 0; i < array.length; i++) {
            bucket[array[i] + bias]++;
        }
        int index = 0, i = 0;
        while (index < array.length) {
            if (bucket[i] != 0) {
                array[index] = i - bias;
                bucket[i]--;
                index++;
            } else
                i++;
        }
        return array;
    }
    
    public static void main(String[] args) throws Exception{
        Scanner in=new Scanner(System.in);        
        System.out.println("请输入数组的大小");        
        int N=in.nextInt();//从键盘读取数组的大小。        
        int A[]=new int [N];        
        System.out.println("请输入数组中的数");        
        for(int i=0;i<N;i++){//一次从键盘中读取输入的数。            
            A[i]=in.nextInt();
        }
        
        countSort(A); 
        for(int m=0;m<N;m++){            
            System.out.print(A[m]+" ");
        }
    }

}

 

9.桶排序

bucketranking原理

 

bucketranking-Java代码

public class bucketranking {
    public static void bucketSort(int[] arr){
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for(int i = 0; i < arr.length; i++){
            max = Math.max(max, arr[i]);
            min = Math.min(min, arr[i]);
        }
        
        //桶数
        int bucketNum = (max - min) / arr.length + 1;
        ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum);
        for(int i = 0; i < bucketNum; i++){
            bucketArr.add(new ArrayList<Integer>());
        }
        
        //将每个元素放入桶
        for(int i = 0; i < arr.length; i++){
            int num = (arr[i] - min) / (arr.length);
            bucketArr.get(num).add(arr[i]);
        }
        
        //对每个桶进行排序
        for(int i = 0; i < bucketArr.size(); i++){
            Collections.sort(bucketArr.get(i));
        }
        
        for (int i = 0; i < bucketArr.size(); i++){
            for (int j = 0; j < bucketArr.get(i).size();j++){
                System.out.print(bucketArr.get(i).get(j).toString()+" ");
            }
        }
//        System.out.println(bucketArr.toString());
    }
    
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);        
        System.out.println("请输入数组的大小");        
        int N=in.nextInt();//从键盘读取数组的大小。        
        int A[]=new int [N];        
        System.out.println("请输入数组中的数");        
        for(int i=0;i<N;i++){//一次从键盘中读取输入的数。            
            A[i]=in.nextInt();
        }
        
        bucketSort(A);        
    }

}

 

10.基数排序

radixranking原理

 

 radixranking-Java代码 

import java.util.*;

public class radixranking {
    public static void radixSort(int[] a){
        sort(a);
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
    }
    public static void sort(int[] array){
        //首先确定排序的趟数;
        int max=array[0];
        for(int i=1;i<array.length;i++){
            if(array[i]>max){
                max=array[i];
            }
        }
        int time=0;
        //判断位数;
        while(max>0){
            max/=10;
            time++;
        }
        //建立 10 个队列;
        List<ArrayList> queue=new ArrayList<ArrayList>();
        for(int i=0;i<10;i++){
            ArrayList<Integer>queue1=new ArrayList<Integer>();            
            queue.add(queue1);
        }
        //进行 time 次分配和收集;
        for(int i=0;i<time;i++){
            //分配数组元素;
            for(int j=0;j<array.length;j++){
            //得到数字的第 time+1 位数;
                int x=array[j]%(int)Math.pow(10,i+1)/(int)Math.pow(10, i);
                ArrayList<Integer>queue2=queue.get(x);
                queue2.add(array[j]);
                queue.set(x, queue2);
            }
            int count=0;//元素计数器;
            //收集队列元素;
            for(int k=0;k<10;k++){
                while(queue.get(k).size()>0){
                    ArrayList<Integer>queue3=queue.get(k);
                    array[count]=queue3.get(0);
                    queue3.remove(0);
                    count++;
                }
            }
        }
    }
    
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);        
        System.out.println("请输入数组的大小");        
        int N=in.nextInt();//从键盘读取数组的大小。        
        int A[]=new int [N];        
        System.out.println("请输入数组中的数");        
        for(int i=0;i<N;i++){//一次从键盘中读取输入的数。            
            A[i]=in.nextInt();
        }
        
        radixSort(A);        
    }
}

 

posted @ 2019-07-29 10:32  Jocelyn-D  阅读(139)  评论(0编辑  收藏  举报