初高级排序 快速排序与归并排序

初级排序:O(n^2)

选择排序(遍历全部数组
将小的一个一个往前排)  插入排序(每次保证前面的次数有序)   冒泡排序(冒泡排序和选择排序就是相逆的 冒泡是先往后排大的)

复杂的排序:O(N*logN)
快排代码:

public static void quickSort(int []
array,int begin,int end){

if(end<=begin)  return ; 
定义一个最后一个数的指针  这个指针之前的数不应该有比它大的

int
pivot=partition(array,begin,end);  定义标杆pivot

quickSort(array,begin,pivot-1);   pivot左侧的数都是小于它的

quickSort(array,pivot+1,end);         pivot右侧的数都是大于它的

static
int partition(int [] a,int begin,int end){

int
pivot=end; int counter=begin;   counter是小于pivot元素的个数

for(int
i=counter;i<end;i++){

if(a[i]<a[pivot]){

int
temp=a[counter];a[counter]=a[i];a[i]=temp;

counter++;

}

}

int
temp=a[pivot];a[pivot]=a[counter];a[counter]=temp;

return
counter;

}

}

归并排序代码:  经典的分治法

public static void mergeSort(int [] array,int
left,int right){

if(right<=left)  return ;

int
mid=(left+right)>>1;  这段与(left+right)/2是一个意思

mergeSort(array,left,mid);  调函数 让左子树变得有序

mergeSort(array,mid+1;right);  同理  右子树有序

merge(array,left,mid,right);
然后合并

static
void merge(int [] arr,int left,int mid,int right){

int
[] temp=new int [right-left+1];  创建一个新的中间数组 需要的长度就是right-left+1

int
i=left;  int j=mid+1; k=0;   i和j分别是左右两个数组的起始下标  k是temp数组里元素的个数

while(i<mid&&j<right){  当i和j循环完自己的左右数组时

temp[k++]=arr[i]<=arr[j]?a[i++]:a[j++];
将i或j小的数赋给k    i小就i往右走 j小就j往右走  同时k++

}

while(i<=mid)  temp[k++]=arr[i++];  走完之后左边没走完就继续走i

while(j<=right)  temp[k++]=arr[j++]; 同理  走j

for(int
p=0;p<temp.length;p++){  新的数组合在一起赋值给原arr数组结束

arr[left+p]=temp[p];

}

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值