排序

排序算法

先写一下快速排序吧,因为是几个排序中比较重要的排序。。
一下三种排序平均复杂度都是O(nlogn)其中快排的最坏情况时O(n*n),其余的最坏最好都是nlogn.
堆排序和快速排序都是一种不稳定的排序

  1. 快速排序

首先,快速排序是通过一趟排序,把数组分成两部分,左边部分全部小于等于某个值,右边部分全部大于等于某个值,即把某个值放在了它应该在的位置,并把所有小于他的数放在他的左边,所有大于他的数放在他的右边。然后在按此方法把两部分继续排序,可以用递归来做

下面附上代码

public class quickSort {
 public static void quickSort(int []a,int begin,int end){
  if(begin<end){
  int i = begin;
  int j = end;
  int key = a[begin];
  while(i<j){
   while(i<j&&a[j]>key)
    j--;
   if(i<j){
    a[i] = a[j];
    i++;
   }
   while(i<j&&a[i]<key)
    i++;
   if(i<j){
    a[j] = a[i];
    j--;
   }
  }
  a[i] = key;
  quickSort(a,begin,i-1);
  quickSort(a,i+1,end);
 }
 }
 public static void main(String []args){
  int a[] = {23,43,287,23,0,24};
  quickSort.quickSort(a, 0, a.length-1);
  for(int i = 0;i<a.length;i++)
   System.out.print(a[i]+" ");
 }
}

有图有真相
在这里插入图片描述
2.归并排序

归并排序采用二分法,将数组分成两部分。然后继续对这两部分进行拆分,对于没拆分的两部分,分别对他们进行排序,然后进行合并,最后得到的就是一个排序的数组了,不再过多解释。

public class mergeSort {
 public static void mergeSort(int a[],int low,int high){
  if(low<high){
   mergeSort(a,low,(low+high)/2);
   mergeSort(a,(low+high)/2+1,high);
   merge(a,low,(low+high)/2,high);
  }
 }
 public static void merge(int []a,int low,int mid,int high){
  int b[] = new int[high-low+1];
  int s = low;
  int t = mid+1;
  int k = 0;
  
  while(s<=mid&&t<=high){
   if(a[s]<=a[t])
    b[k++] = a[s++];
   else
    b[k++] = a[t++];
  }
  while(s<=mid)
   b[k++] = a[s++];
  while(t<=high)
   b[k++] = a[t++];
  for(int i = 0;i<b.length;i++){
   a[low+i] = b[i];
  }
 }
 public static void main(String [] args){
  //ArrayList<Integer> a = new ArrayList<Integer>();
  int a[] = {787,98,15,78,65,-28};
  mergeSort.mergeSort(a,0,a.length-1);
  for(int i = 0;i<a.length;i++){
  System.out.print(a[i]+" ");
  } 
 }
}

在这里插入图片描述
3.堆排序

堆排序是采用了一种堆的数据结构排序的算法。有大顶堆和小顶堆。他们之间的下标与结点有一个关系
大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]
当要升序排列时要建大顶堆,反之小顶堆
把堆顶元素往最后换,重新调整大顶堆,一只重复此步骤,最后会变成一个升序的数组
附上代码:

public class heapSort {
 public static void heapSort(int [] array){
  for(int i = array.length/2-1;i>=0;i--)
   adjustHeap(array,i,array.length);
  for(int j = array.length-1;j>0;j--){
   int temp = array[j];
   array[j] = array[0];
   array[0] = temp;
   adjustHeap(array,0,j);
  }
    
 }
 public static void adjustHeap(int []array,
   int i,int length){
  int temp = array[i];
  for(int k = 2*i+1;k<length;k=k*2+1){
   if(k+1<length&&array[k]<array[k+1])
    k++;
   if(array[k]>temp){
    array[i] = array[k];
    i = k;
   }
   else
    break;
  }
  array[i] = temp;
 }
 public static void main(String []args){
  int b[] = {83,9,67,4,-2,56,23,18};
  heapSort.heapSort(b);
  for(int i = 0;i<b.length;i++){
   System.out.print(b[i]+" ");
  }
 }
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值