排序算法

归并排序 快速排序

我们先把数组从中间分成前后两部 分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。

package test_2019_08_03.sort;

/**
 * @author xuanyuanpu
 * @date 2019/8/8 - 18:07
 */
public class Sort {
    public static void main(String[] args) {

        int[] arr = {19, 9, 8, 5, 6, 5, 5, 3, -1, 1, 2};
        mergeSort(arr, 0, arr.length - 1);

        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "<");
        }
    }

    //归并排序
    public static void mergeSort(int[] arr, int left, int right) {

        if (left >= right) {
            return;
        }

        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);


        //方法一  使用临时数组归并
        int[] tmp = new int[arr.length];

        int i = left;
        int j = mid + 1;
        int m = right;

        for (int x = left; x <= right; x++) {
            if (i > mid || j > right) {
                break;
            }
            if (arr[i] <= arr[j]) {
                tmp[x] = arr[i];
                i++;
                m = x;
                continue;
            } else {
                tmp[x] = arr[j];
                j++;
                m = x;
                continue;
            }
        }

        if (j > right) {
            for (int k = m+1; k <= right; k++) {
                tmp[k] = arr[i];
                i++;
            }
        } else {
            for (int k = m+1; k <= right; k++) {
                tmp[k] = arr[j];
                j++;
            }
        }

        for (int x = left; x <= right; x++) {
            arr[x] = tmp[x];
        }


        //方法二  使用插入排序归并
       /* int flag=left;

        for (int i = mid+1; i <= right; i++) {

            if (arr[i] >= arr[i - 1]) {
                return;
            }

            for (int j = flag ; j < i; j++) {
                if (arr[i] > arr[j]) {
                    continue;
                }

                int x = arr[i];

                for (int n = i; n > j; n--) {
                    arr[n] = arr[n - 1];
                }
                arr[j] = x;
                flag = j+1;
                break;
            }
        }*/
    }

  //快速排序
  public static void quickSort(int[] arr,int left,int right) {

      if (left >= right) {
        return;
      }

      int flag = right;
      int start = left;
      int end = right-1;
      while (start <= end) {

          while (start <= end) {
              if (arr[start] < arr[flag]) {
                  start++;
                  continue;
              }
              int tmp = arr[flag];
              arr[flag] = arr[start];
              arr[start] = tmp;
              flag = start;
              start++;
              break;
          }

          while (start <= end) {
              if (arr[end] >= arr[flag]) {
                  end--;
                  continue;
              }
              int tmp = arr[flag];
              arr[flag] = arr[end];
              arr[end] = tmp;
              flag = end;
              end--;
              break;
         }
    }
  quickSort(arr,left,flag-1);
  quickSort(arr,flag+1,right);	
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值