排序动画
归并排序
归并排序利用分治思想,其计算步骤如下:
- 分解:将n个元素平均分成各含n/2个元素的子序列;
- 解决:用归并排序对两个子序列递归地排序;
- 合并:合并两个已排序的子序列以得到结果。
比较直观的归并动态图如下:
java代码如下:
public class MergeSort{
public static void main(String args[]){
int[] data = {-35, -456,-924,23,6,2,4,123,614,93};
mergeSort(data, 0, data.length - 1);
print(data);
}
public static void print(int []data){
//打印数组
int len = data.length;
for(int i = 0; i < len; i ++){
System.out.print(data[i] + "\t");
}
System.out.println();
}
public static void mergeSort(int data[], int left, int right){
//归并排序
if(left < right){
int center = (left + right)/2;
mergeSort(data, left, center);
mergeSort(data, center + 1, right);
merge(data, left, center, right);
}
}
public static void merge(int data[], int left, int center, int right){
// 合并两个有序数组
int[] tempData = new int[right - left + 1]; //辅助数组,存储合并后的有序数组
int tempLeft = left;
int tempRight = center + 1;
int index = 0;
//将较小的数移到tempData中
while(tempLeft <= center && tempRight <= right){
if(data[tempLeft] > data[tempRight]){
tempData[index ++] = data[tempRight ++];
}else{
tempData[index ++] = data[tempLeft ++];
}
}
//将左边的剩余数移到tempData中
while(tempLeft <= center){
tempData[index ++] = data[tempLeft ++];
}
//将右边的剩余数移到tempData中
while(tempRight <= right){
tempData[index ++] = data[tempRight ++];
}
//用tempData中数值复制到data中
for(int i = 0; i < right - left + 1; i ++){
data[i + left] = tempData[i];
}
}
}
归并排序的优点:
- 归并排序是稳定的排序;
- 在最好和最坏情况下,时间复杂度都是O(nlogn)