- 选择排序
在剩余的数组中选择最小的插入到相应位置
时间复杂度:O(N^2)
public static void sort(int[] a,int low,int high){
for(int i = 0;i<=high;i++){
int minIndex = i;
for(int j = i+1;j<=high;j++){
if(a[j]<a[minIndex])
minIndex = j;
}
swap(a,i,minIndex);
}
}
2.插入排序
类似与整理纸牌,将下一个数字与已排序完成的部分作比较,进行插入
时间复杂度:O(N^2)
for(int i = 1;i<=high;i++){
int e = a[i];
int j;
for(j = i;j>0&&a[j-1]>e;j--)
a[j] = a[j-1];
a[j] = e;
}
插入排序比选择排序快,因为插入排序可以提前终止内层循环
在数组本身接近有序时,插入排序的效率很高,甚至高于O(N)的算法。
3.归并算法
把数组分为两部分,每个部分再继续分为两部分,知道每个部分只有一个元素(这部分时间复杂度是O(logN)),然后进行性比较,把每个部分按照顺序合并起来(这部分时间复杂度是O(N)),总的时间复杂度是O(NlogN),另外需要一个辅助数组空间帮助我们合并,因此空间复杂度是O(N)
public static void sort(int[] a,int low,int high){
if(low>=high)
return;
int mid = low+(high-low)/2;
sort(a,low,mid);
sort(a,mid+1,high);
merge(a,low,mid,high);
}
public static void merge(int[] a,int low,int mid,int high){
int[] temp = new int[high-low+1];
for(int i = low;i<=high;i++)
temp