Insertion Sort(插入排序)

思路:for 循环遍历数组中的每一个数

   用while将每次遍历到的数于左侧的数进行对比,将小的排到左边

void InsertionSort(int*A, int n){
    int key,i=0,p;
    for(p=0;p<n;p++){
        key=A[p];
        i=p-1;
        while(i>=0 && A[i]>key){
            A[i+1]=A[i];
            i=i-1;
        }
        A[i+1]=key;
    }
}

中规中矩的排序方法

时间复杂度:

Best-case Running time  : O(n)(数组已经被排好序的情况)

Worst-case Running Time :  O(n^2)

Average Running Time :  O(n^2)

从时间复杂度来看,处理少量数据还可以。当数据量较为庞大时,速度就很慢了

 

Merge Sort

思路:利用递归将数组分成两个相同大小的部分,直至长度为1

   然后利用merge函数分别对每个部分进行排序

   最后重新放在一起

void Merge(long int*A,long int left,long int center,long int right){
    long int i1=left,i2=center+1,i=0,j;
    long int B[100000];
    long int length =sizeof(B)/sizeof(B[0]);
//比较左右两侧的大小,然后将小的的放入数组B
    while (i1<=center && i2<=right)
    {   
        if(A[i1]>A[i2]){
            B[i++]=A[i2++];
        }else{
            B[i++]=A[i1++];
        }
    }
//将左侧或者右侧剩余的数以此放入数组B中
    for(;i1<=center;i1++){
        B[i++]=A[i1];
    }
    for(;i2<=right;i2++){
        B[i++]=A[i2];
    }
//将数组B中排好序的值赋给A
//由于每调用一次函数,B数组都会重新创建,因此B从0开始,A从left开始
    for(j=0,i=left;j<=right-left;j++,i++){
        A[i]=B[j];
    }
    
}

void MergerSort(long int*A,long int left,long int right){
    long int center=0;
    if(left>=right){
        return ;
    }
    center=(left+right)/2;
//这种先进行第一个递归,直至最后,没进行一次就相当于建立一层平台,当进行完后再返回上一层,执行下一个语句
    MergerSort(A,left,center);
    MergerSort(A,center+1,right);
    Merge(A,left,center,right);
}

这个就是merge sort 的排序过程:

 

个人觉得递归部分的代码不是很好理解,其余部分都还可以

时间复杂度:

 

版权声明:本文为Listev原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Listev/p/14697505.html