排序专题

排序动画

排序动画

归并排序

归并排序利用分治思想,其计算步骤如下:

  • 分解:将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)
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页