各类基础排序代码(简单插入,希尔,快速,堆,归并)

 

目录

简单插入排序:

希尔排序(SHELL)改进的简单插入排序:

快速排序:

堆排序:

 归并排序:


简单插入排序:

无需递归等调用嵌套两层循环,从数组的第二项开始往前插入。

代码:

  • //直接插入排序
    void InsertSort(int A[], int n){
        int i,j;
        //A[0]是用作存储单元
        for(i = 2; i<=n; i++){
            if(A[i] < A[i-1]){
                A[0] = A[i];
                for(j=i-1;A[0]<A[j];--j){
                    A[j+1]=A[j];
                }
                A[j+1] = A[0];
            }
        }
    }

希尔排序(SHELL)改进的简单插入排序:

dk表示将原数组分成若干数组序列的偏移量,注意,对于分成的不同数组序列,调用简单插入排序,并不是一个序列完成后进行另一个序列,而是在原数组序列中不断加1,进行不同数组序列的切换。

代码:

  • //希尔(SHELL)排序
    void ShellSort(int A[], int n){
        int dk;
        int j;
        for (dk=n/2; dk>=1; dk=dk/2){
            //对于不同的数组交叉排序
            for(int i = 1+dk; i<=n; i++){
                if(A[i]<A[i-dk]){
                    A[0] = A[i];
                    for(j=i-dk; j>0 && A[j]<=A[0]; j=j-dk){
                        A[j+dk] = A[j];
                    }
                    A[j+dk] = A[0];
                }
            }
        }
    }


快速排序:

快速排序正如其名,事件复杂度低,但是不稳定,需要递归,存在两个函数主体。

代码:

  • //快排
    //进行一次排序,返回一次排序后固定的位置
    int Partition(int A[], int low, int high){
        int pivot = A[low];//设置中枢
        while(low < high){
            while(low < high && A[high] >= pivot){
                high--;
            }
            while(low < high && A[low] <= pivot){
                low++;
            }
        }
        A[low] = pivot;
        return low;
    }
    //快排递归主体
    void QuickSort(int A[]; int low; int high){
        if(low < high){
            int pivot = Partition(A,low,high);
            QuickSort(A,low,pivot-1);
            QuickSort(A,pivot+1,high);
        }
    }

堆排序:

堆排序无需递归,事件复杂度也比较低,也是不稳定的算法。通过三个函数主体构成。一个用来调整以规定头节点为根节点的堆。一个用来整体调整堆。一个用来进行堆排序。

代码:

  • //堆排
    //调整堆(对于选中节点k为根节点)
    //大根堆
    void HeadAdjust(int A[], int k, int len){
        A[0] = A [k];
        for(int i=2*k; i<=len; i*=2){
            if(i<len && A[i]<A[i+1]){
                i++;
            }
            if(A[i]<=A[0]){
                break;
            }
            else{
                A[i]=A[0];
                k=i;
            }
        }
    }
    //对整体堆进行调整
    void BuildMaxHeap(int A[], int len){
        for(int i = len/2; i>0; i--){
            HeadAdjust(A,i,len);
        }
    }
    //元素下坠调整堆
    void HeapSort(int A[]; int len){
        BuildMaxHeap(A, len);
        for(int i=len; i>1; i--)
        {
            swap(A[i],A[1]);
            HeadAdjust(A,1,i-1);
        }
    }

 归并排序:

归并排序我认为是比较难理解的了,它有两个函数主体,并且一个函数为递归调用,需要一个辅助数组。将原数组分成若干归并段,两两归并。

代码:

  • //归并排序
    //需要一个额外的辅助数组,与待排数组大小相同
    //是原数组中的元素个数,创建了一个新的数组存放A中相同的元素
    int *B= (int*)malloc((n+1)*sizeof(int));
    void Merge(int A[], int low, int high, int mid){
        int i, j, k;
        //将A中元素复制到B辅助数组中
        for(int k=low;k<=high;k++){
            B[k]=A[k];
        }
        for(i = low, j=mid+1, k=i; i< mid && j<=high; k++){
            if(B[i]<=B[j]){
                A[k] = B[i];
                i++;
            }
            else{
                A[k]=B[j];
                j++;
            }
        }
        while (i<=mid)
        {
            A[k++]=B[i++];
        }
        while (j<=high)
        {
            A[k++]=B[j++];
        } 
    }
    //归并排序主体函数
    //递归调用
    void MergeSort(int A[], int low, int high){
        if(low<high){
            int mid = (low+high)/2;
            //递归调用让归并段减小
            MergeSort(A,low,mid);
            MergeSort(A,mid+1,high);
            Merge(A,low,high,mid);
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值