初级排序: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];
}
}
}