在白纸上写几种排序的代码

对于一个int数组,请编写一个插入排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。


测试样例:
[1,2,3,5,2,3],6

[1,2,2,3,3,5]

插入排序如下

import java.util.*;


public class InsertionSort {
    public int[] insertionSort(int[] A, int n) {
        // write code here
        if(null==A||n<=0)
            return A;
        for(int i=1;i<n;i++){
            for(int j=i;j>0;--j){
                if(A[j]<A[j-1]){
                    int temp  =A[j-1];
                    A[j-1] = A[j];
                    A[j] = temp;
                }
            }
        }
        return A;
    }
}

归并排序如下

import java.util.*;


public class MergeSort {
    public int[] mergeSort(int[] A, int n) {
        // write code here
        if(null==A||n<=1)
            return A;
        int start = 0,end = n-1;
        int[] copy = new int[n];//归并排序需要一个辅助数组
        merge(A,copy,start,end);
        return A;
    }
    private void merge(int[] A, int[] copy, int start, int end){
        if(start==end)
            return;
        int mid = (start+end)>>1;
        merge(A,copy,start,mid);
        merge(A,copy,mid+1,end);
        for(int i=start;i<=end;i++)//先让辅助数组跟原数组一样
            copy[i] = A[i];
        int id = start;
        int m = start;
        int n = mid+1;
        while(m<=mid&&n<=end){
            if(copy[m]<=copy[n]){
                A[id++] = copy[m++];
            }else{
                A[id++] = copy[n++];
            }
        }
        while(m<=mid)
            A[id++] = copy[m++];
        while(n<=end)
            A[id++] = copy[n++];
    }
}


快速排序

import java.util.*;


public class QuickSort {
    public int[] quickSort(int[] A, int n) {
        // write code here
        if(null==A||n<=1)
            return A;
        int start = 0,end=n-1;
        quick(A,start,end);
        return A;
    }
    private void quick(int[] A, int start, int end){
        if(start>=end)
            return;
        int key = A[start];//选择一个划分值
        int i=start,j;
        //如果此处元素小于划分值,则把此元素和i+1处元素交换,并将i加1,如大于或等于划分值则继续循环
        for(j=start+1;j<=end;j++){
            if(A[j]<key){
                int temp = A[j];
                A[j] = A[i+1];
                A[i+1] = temp;
                i++;
            }
        }
        A[start] = A[i];
        A[i] = key;
        quick(A,start,i-1);
        quick(A,i+1,end);
    }
}


堆排序

import java.util.*;


public class HeapSort {
    public int[] heapSort(int[] A, int n) {
        // write code here
        if(null==A||n<=1)
            return A;
        for(int i=0;i<n-1;i++){
            buildMaxHeap(A,n-1-i);
            swap(A,0,n-1-i);
        }
        return A;
    }
    private void buildMaxHeap(int[] A, int lastIndex){//建大根堆
       for(int i=(lastIndex-1)/2;i>=0;i--){//从lastIndex节点的父节点开始建堆
           int k = i;//记录当前节点
           while((2*k+1)<=lastIndex){//为每个节点建立大根堆,只要这个根节点还有子节点 
               int bigIndex = 2*k+1;//假设左节点的值最大
               if(bigIndex<lastIndex){//有右节点存在
                   //子节点中的最大值
                   if(A[bigIndex]<A[bigIndex+1])
                       bigIndex++;
               }
               //根节点跟子节点比较
               if(A[k]<A[bigIndex]){
                   swap(A,k,bigIndex);
                   k = bigIndex;
               }
               else
                   break;
           }
       } 
    }
    private void swap(int[] A, int i, int j){
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值