常见的排序算法

package Sort;
import java.util.Scanner;
import java.util.Stack;;
public class TestSort {
    //冒泡
    //插入
    //选择
    //希尔
    //快排
    //堆排序
    //归并

    //冒泡O(n^2)
    public void bubbleSort(int[] nums)
    {
        int n = nums.length;
        for(int i =0;i < n - 1;i++)
        {
            for(int j = 1; j < n - i;j++)
            {
                if(nums[j] < nums[j-1])
                {
                    int temp = nums[j];
                    nums[j] = nums[j-1];
                    nums[j-1] = temp;
                }
            }
        }
    }
    //选择O(n^2)
    public void selectSort(int[] nums)
    {
        int n = nums.length;
        for(int i = 0; i < n-1; i++)
        {
            int minIndex = i;
            for(int j = i+1; j < n;j++)
            {
                if(nums[j] < nums[minIndex]) minIndex = j;
            }
            if(minIndex != i)
            {
                int temp = nums[i];
                nums[i] = nums[minIndex];
                nums[minIndex] = temp;
            }
        }
    }
    //插入O(n^2)
    public void insertSort(int[] nums)
    {
        int n = nums.length;
        for(int i = 1; i < n;i++)
        {
            int num = nums[i];
            int j = i-1;
            for(; j >=0 && num < nums[j]; j--)
                nums[j+1] = nums[j];
            nums[j+1] = num;
        }
    }
    //希尔(O(n^1.3))
    public void shellSort(int[] nums)
    {
        int n = nums.length;
        for(int d = n/2;d>=1;d/=2)
        {
            for(int i = d; i < n;i++)
            {
                int temp = nums[i];
                int j = i-d;
                for(;j>=0 && temp < nums[j];j-=d)
                {
                    nums[j+d] = nums[j];
                }
                nums[j+d] = temp;
            }
        }
    }
    //快排(O(nlogn))
    public void quickSort(int[] nums)
    {
        helper(0, nums.length-1, nums);
    }
    private void helper(int left, int right, int[] nums)
    {
        if(left >= right) return;
        int mid = sort(left, right, nums);
        helper(left, mid-1, nums);
        helper(mid+1, right, nums);
    }
    private int sort(int left, int right, int[] nums)
    {
        int temp = nums[left];
        while(left < right)
        {
            while(left < right && nums[right] >= temp){right--;}
            if(left < right)nums[left] = nums[right];
            while(left < right && nums[left] <= temp){left++;}
            if(left < right){nums[right] = nums[left];}
        }
        nums[left] = temp;
        return left;
    }
    //堆排序O(nlogn)
    public void heapSort(int[] nums)
    {
        int n = nums.length;
        for(int i = n/2;i>=1;i--)
        {
            shift(nums, i, n);
        }
        System.out.println(nums[0]);
        for(int i = 1; i < n;i++)
        {
            int temp = nums[n-i];
            nums[n-i] = nums[0];
            nums[0] = temp;
            shift(nums, 1, n-i);
        }
    }
    private void shift(int[] nums,int k, int m)
    {
        int i = k,j = 2*i;
        while(j <= m)
        {
            if(j<m && nums[j-1] < nums[j])j++;
            if(nums[i-1] > nums[j-1])break;
            else
            {
                int temp = nums[i-1];
                nums[i-1] = nums[j-1];
                nums[j-1] = temp;
                i = j; j = 2*i;
            }
        }
    }
    //O(n)Membery mergeSort
    public void mergeSort(int[] nums)
    {
        int n = nums.length;
        helper(nums,  0, n-1);
    }
    private void helper(int[] nums1,int b, int e)
    {
        if(b < e) 
        {
            int mid = (b + e) >> 1;
            helper(nums1,  b, mid);
            helper(nums1,  mid+1, e);
            merge(nums1, b,mid,e);
        }
    }
    void merge(int[] nums1,int b, int m,int e)
    {
        int[] nums2 = new int[nums1.length];
        int i = b, j = m + 1, k = b;
        while(i <= m && j <=e)
        {
            if(nums1[i] <= nums1[j]){nums2[k++] = nums1[i++];}
            else nums2[k++] = nums1[j++];
        }
        while(i <= m){nums2[k++] = nums1[i++];}
        while(j <= e){nums2[k++] = nums1[j++];}
        for(int ii = b; ii <=e; ii++)
        {
            nums1[ii] = nums2[ii];
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestSort t = new TestSort();
//      Scanner s = new Scanner(System.in);
//      int k = s.nextInt();
//      for(int i = 0;i<k;i++)
//      {
//          String m = s.next();
//          System.out.println(m);
//      }
        int[] nums = new int[]{3,3331,1114,1,3,15,6,1};
        t.mergeSort(nums);
        for(int n : nums){System.out.print(n+" ");}
//      System.out.println();
//      nums = new int[]{3,1,421,1,333333,5,6,1};
//      t.insertSort(nums);
//      for(int n : nums){System.out.print(n+" ");}
//      System.out.println();
//      nums = new int[]{3,1,4,1,3,5,6,1};
//      t.selectSort(nums);
//      for(int n : nums){System.out.print(n+" ");}
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值