学习排序算法

把目前学习的排序算法记下来,方便以后复习
package Sort;

//冒泡
public class SimpleSort {

    public static void main(String[] args) {
        int[] a={3,2,5,4,1};
        //System.out.println(a.length);
        sort(a);
        for(int i=0;i<a.length;i++){
            System.out.println(a[i]);
       }

    }

    private static void sort(int[] a) {
        int temp=0;
        for(int i=0;i<a.length;i++){
            for(int j=0;j<a.length-i-1;j++){
                if(a[j]>a[j+1]){
                    temp=a[j+1];
                    a[j+1]=a[j];
                    a[j]=temp;
                }
            }
        }
    }

}

package Sort;

//插入
public class InsertSort {
    private static int i=0;
    private static int temp=0;
    public static void main(String[] args) {
        int[] a = {7,8,9,4,5,3,2,6};   
        insertSort(a,a.length);
        print(a);
    }

    private static void print(int[] a) {
        for(i=0;i<a.length;i++){
            System.out.println(a[i]);
        }
    }

    private static void insertSort(int[] a, int n) {
        //插入排序是从第一张牌开始,即假设第一张牌已经有序
        for(int p=1;p<n;p++){
        //用temp保存当前值
        temp=a[p];
        //令i等于当前位置,当i>=1(即不是最初的那个位置)且前一张牌大于当前牌值
        //循环一遍,i--向前移动一位
           for(i=p;i>=1&&a[i-1]>temp;i-=1)
               //将前牌值赋给当前牌值
               a[i]=a[i-1];
           //再把temp值赋给前一个位置值,这里看似还是给i赋值,但是循环一遍结束,i--即已经向前移动一位
           //当前i值表示前一位的位置
           a[i]=temp;
       }
        
    }
    

}

package Sort;

//希尔
public class ShellSort {
    private static int i=0;
    private static int temp=0;
    private static int D;
    public static void main(String[] args) {
        int[] a = { 61, 25, 29, 105, 52, 108, 73, 58, 38, 64, 14, 55, 98, 94, 102, 35, 60, 68, 15, 27, 103,
                73, 55, 35, 33, 47, 35, 16, 31, 108, 46, 65, 89, 13, 51, 51, 99, 113, 66, 111, 99, 64, 54,
                117, 20, 14, 106, 9, 29, 11, 25, 100, 58, 79, 69, 84, 106, 59, 92, 42, 11, 92, };
    shellSort(a,a.length);
    print(a,a.length);
    }

    private static void print(int[] a, int n) {
        for(i=0;i<n;i++){
            System.out.println(a[i]);
        }
        
    }

    private static void shellSort(int[] a, int n) {
        //希尔增列,通常初始化为n/2,循环条件大于0;步长D/2
       for(D=n/2;D>0;D/=2){
           //将1换成希尔增列D的插入排序
           //先拿到D张牌,
           for(int p=D;p<n;p++){
               //存取当前牌值
               temp=a[p];
               //与前D张牌比较,步长i-D
               for(i=p;i>=D&&a[i-D]>temp;i-=D)
                   //swap
                   a[i]=a[i-D];
               //将临时值temp赋给前D张牌值
               a[i]=temp;
           }
       }
    }
    

}

package Sort;

//快排
public class QuickSort {
    public static void main(String[] args) {
        int[] a = { 61, 25, 29, 105, 52, 108, 73, 58, 38, 64, 14, 55, 98, 94, 102, 35, 60, 68, 15, 27, 103,
                73, 55, 35, 33, 47, 35, 16, 31, 108, 46, 65, 89, 13, 51, 51, 99, 113, 66, 111, 99, 64, 54,
                117, 20, 14, 106, 9, 29, 11, 25, 100, 58, 79, 69, 84, 106, 59, 92, 42, 11, 92, };
        quickSort(a,0,a.length-1);
        for (int k : a) {
            System.out.println(k);
        }
    }

    public static void quickSort(int[] a,int l,int h){  
        //先定义一个位置
        int pos;
        if(l<h){
            //首先找到第一个数的确切位置
            pos=find(a,l,h);
            //从第一个数左边一半递归
            quickSort(a,l,pos-1);
            //第一个数位置右边一半递归
            quickSort(a,pos+1,h);
        }
    }  
    public static int find(int[] a,int l,int h){
        //先取数组的第一个数,开始排序
        int val=a[l];
        //l和h重合时,循环结束,l++,h--
        while(l<h){
            //若h和l重合且a[h]元素大于等于第一个元素时候,继续向前遍历
            while(h>l&&a[h]>=val){
                //继续往前遍历
                h--;
            }
            //若不满足时候,即将a[h]值赋给a[l]
            a[l]=a[h];
            
            //若l和h重合且a[l]元素等于第一个元素时,继续向后遍历
            while(l<h&&a[l]<=val){
                //继续遍历
                l++;
            }
            //不满足时,将a[l]赋给a[h];
            a[h]=a[l];
        }
        //第一次遍历完,将第一个数的值赋给当前a[l],且返回l的为位置,即为第一个数的位置
        //其实l和h已经重合,即此时候l位置即为val值的位置,将val赋给该位置,即第一个数的确切位置,且返回第一个数的位置
        a[l]=val;
        return l;
    }  
}

package Sort;

//归并
public class MergeSort {
    private static int i;

    public static void main(String[] args) {
        int[] a = { 61, 25, 29, 105, 52, 108, 73, 58, 38, 64, 14, 55, 98, 94, 102, 35, 60, 68, 15, 27, 103,
                73, 55, 35, 33, 47, 35, 16, 31, 108, 46, 65, 89, 13, 51, 51, 99, 113, 66, 111, 99, 64, 54,
                117, 20, 14, 106, 9, 29, 11, 25, 100, 58, 79, 69, 84, 106, 59, 92, 42, 11, 92, };
        mergeSort(a, a.length);
        print(a);

    }

    private static void mergeSort(int[] a, int length) {
        sort(a, 0, a.length - 1);

    }

    private static void print(int[] a) {
        for (i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }

    private static void sort(int[] a, int left, int right) {
        if (left >= right)
            return;
        int leftEnd = (left + right) / 2;
        sort(a, left, leftEnd);
        sort(a, leftEnd + 1, right);
        merge(a, left, leftEnd, right);

    }

    private static void merge(int[] a, int left, int leftEnd, int right) {
        // 临时数组
        int[] temp = new int[a.length];
        // 右边第一个索引
        int rightFirst = leftEnd + 1;
        // 临时数组的索引
        int tempIndex = left;
        // 保存当前数组的第一个索引
        int tem = left;
        while (left <= leftEnd && rightFirst <= right) {
            if (a[left] <= a[rightFirst]) {
                temp[tempIndex++] = a[left++];
            } else {
                temp[tempIndex++] = a[rightFirst++];
            }
        }
        // 将剩余的元素拷贝到临时数组中,实际上只会执行两个while的其中一个
        while (rightFirst <= right) {
            temp[tempIndex++] = a[rightFirst++];
        }
        while (left <= leftEnd) {
            temp[tempIndex++] = a[left++];
        }
        // 最后将临时数组的元素拷贝到原数组中left到right中
        while (tem <= right) {
            a[tem] = temp[tem++];
        }

    }

}

package Sort;

//堆排
public class HeapSort {

    public static void main(String[] args) {
       int[] arry={5, 3, 6, 2, 1, 9, 4, 8, 7};
       heapSort(arry);
       print(arry);
    }
    private static void print(int[] arry) {
        for(int i=0;i<arry.length;i++){
            System.out.print(arry[i]+"\t");
        }
        System.out.println();
        
    }
    
    //排序
    public static void heapSort(int[] arry){
        for(int i=0;i<arry.length;i++){
            //找到最后一个索引
            int lastindex=arry.length-1-i;
            //1.重建最大堆
            buildHeap(arry,lastindex);
            //2.堆顶与最后一位替换
            swap(arry,0,arry.length-1-i);
            print(arry);
        }
      
    }
    
    //左子节点:2*i+1,右子节点:2*i-1
    private static void buildHeap(int[] arry,int lastindex) {
        for(int i=(lastindex-1)/2;i>=0;i--){
            //k保存当前判断节点
            int k=i;
            
            //判断当前节点是否存在子节点
            while(2*k+1<=lastindex){
                //定义当前节点的左子节点
                int biggerindex=2*k+1;
                //判断是否存在右子节点
                if(biggerindex<lastindex){
                    //若当前节点的左子节点小于右子节点时,使最大索引改为右子节点
                    if(arry[biggerindex]<arry[biggerindex+1]){
                        
                        biggerindex++;
                    }
                }
                //如果当前节点的根节点小于最大子节点,则将最大值赋当前根节点
                if(arry[k]<arry[biggerindex]){
                    swap(arry,k,biggerindex);
                    //因为swap后,需要再将大值节点值赋给当前节点,重新进入while循环判断当前节点是否含有子节点,并比较大小
                    k=biggerindex;
                }else{
                    break;
                }
            }
        }
        
    }
    //交换
    private static void swap(int[] arry,int i,int j) {
        if(i==j){
            return;
        }
        arry[i]=arry[i]+arry[j];
        arry[j]=arry[i]-arry[j];
        arry[i]=arry[i]-arry[j];
    } 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值