归并排序
归并排序思想
归并排序的思想:针对已排序好的两个或两个以上的文件,经由合并的方式,并将其组合为一个大的且已经排好序的文件。
时间复杂度: O(nlogn)
空间复杂度:O(n)
是一种稳定的排序方式
实现过程:
归并排序代码
代码:
package javapaixu;
import java.util.Arrays;
/**
* 归并排序
* 时间复杂度:O(nlogn)
* 稳定性:不稳定
* 空间复杂度:O(n)
*/
public class Guibing {
public static void mergeSort(int[] array) {
if(array == null || array.length == 0) {
return;
}
for(int i = 1;i < array.length;i = i*2) {
merge(array,i);
}
}
public static void merge(int[] array, int gap) {//gap每个归并段的数据个数
int start1 = 0;
int end1 = start1+gap-1;
int start2 = end1+1;
int end2 = start2+gap-1<array.length-1? start2+gap-1:array.length-1;
//排序
int[] tmparray = new int[array.length];
int i = 0;//tmparray的下标
while(start2 < array.length) {
//比较元素 s1 s2 s1++ s2++
//两个归并段是否都有数据
while(start1 <= end1 && start2 <= end2) {
if(array[start1] < array[start2]) {
tmparray[i++] = array[start1++];
}else {
tmparray[i++] = array[start2++];
}
}
while(start1 <= end1) {
tmparray[i++] = array[start1++];
}
while(start2 <= end2) {
tmparray[i++] = array[start2++];
}
//赶往下一个递归段
start1 = end2+1;
end1 = start1+gap-1;
start2 = end1+1;
end2 = start2+gap-1<array.length-1? start2+gap-1:array.length-1;
}
//剩下的s1 e1之间的内容需要放进tmparray
while(start1 < array.length) {
tmparray[i++] = array[start1++];
}
/*for(int j = 0;j < tmparray.length;j++) {
array[j] = tmparray[j];
}*/
System.arraycopy(tmparray, 0, array, 0, tmparray.length);
}
public static void main(String[] args) {
int[] array = {68,5,9,58,64,21,19};
mergeSort(array);
System.out.println(Arrays.toString(array));
}
}
运行结果:
[5, 9, 19, 21, 58, 64, 68]
基数排序
基数排序不需要元素之间的比较,属于一种分配模式的排序方法,对于给定的一组数据,先准备从0~9十个箱子,先比较个位数,个位是0的放入0号箱子,个位是1的放入1号箱子,个位是2的放入2号箱子……,然后从0号到9号一次取出,在比较十位数,十位是0的放入0号箱子,十位是1的放入1号箱子,十位是2的放入2号箱子……
然后从0号到9号一次取出,再比较百位数,千位数……然后依次取出来就排好了
这组数据最大只有三位数,到百位就完了