/**
* 排序方法:冒泡排序
* 复杂度:O(N*N)
* 特点:挨个往后冒,不符合规则则交换
* */
public static void maoPao(ArrayList<Integer>arrayList){
for(int i=0;i<arrayList.size();i++){
int needToMin = arrayList.get(i);
for(int j=i+1;j<arrayList.size();j++){
int needToComp = arrayList.get(j);
if(needToMin>needToComp){
int temp =arrayList.get(i);
arrayList.set(i, arrayList.get(j));
arrayList.set(j, temp);
needToMin = arrayList.get(i);
}
}
}
}
public class Example{
public static void divide(int[] arr,int start,int end){
//递归的终止条件: 即分到不可再分
if(start >= end) {
return;
}
//计算中间值
int mid = start + (end - start)/2;
//递归分直到单个数据
divide(arr,start,mid);
divide(arr,mid+1,end);
//治:从单个数据合并为一个整体
merge(arr,start,mid,end);
}
public static void merge(int[] arr,int start,int mid,int end){
// 合并后的数组
int[] temp = new int[end-start+1];
//存一下变量
int i=start,j=mid+1,k=0;
//下面就开始两两进行比较,若前面的数大于后面的数,就构成逆序对
while(i<=mid && j<=end){
//若前面小于后面,直接存进去,并且移动前面数所在的数组的指针即可
if(arr[i] <= arr[j]){
temp[k++] = arr[i++];
}else{
temp[k++] = arr[j++];
}
}
//各自还有剩余的没比完,直接赋值即可
while(i<=mid) {
temp[k++] = arr[i++];
}
while(j<=end) {
temp[k++] = arr[j++];
}
//覆盖原数组
for (k = 0; k < temp.length; k++) {
arr[start + k] = temp[k];
}
}
public static void main(String[] args) {
int[]str=new int[]{123,13,43,23,2};
System.out.println("排序前:");
for(int i=0;i<str.length;i++){
System.out.print(str[i]+" ");
}
System.out.println();
divide(str, 0, str.length-1);
System.out.println("归并排序后:");
for(int i=0;i<str.length;i++){
System.out.print(str[i]+" ");
}
System.out.println();
}
}