常见排序算法(C语言实现)

常见排序算法(C语言实现)

在这里插入图片描述

一、插入排序

void insertSort(int arr[], int n){
    int i, j, tmp;
    for(i = 1; i < n; i++)
        for(j = i; j > 0; j--){
            if(arr[j] < arr[j-1]){
                tmp = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = tmp;
            }
            else
                break;
        }
    return;
}

二、希尔排序

void shellSort(int arr[], int n){
    int i, j, elem;
    int k = n/2;
    while(k>=1){
        for(i = k; i < n; i ++){
            elem = arr[i];
            for(j = i; j >= k; j-=k){
                if(elem < arr[j-k])
                    arr[j] = arr[j-k];
                else
                    break;
            }
            arr[j] = elem;
        }
        k = k/2;
    }
}

三、选择排序

void selectSort(int arr[], int n){
    int i, j , minValue, tmp;
    for(i = 0; i < n-1; i++){
        minValue = i;
        for(j = i + 1; j < n; j++)
            if(arr[minValue] > arr[j])      
                minValue = j;     
        if(minValue != i){
            tmp = arr[i];
            arr[i] = arr[minValue];
            arr[minValue] = tmp;
        }
    }
}

四、堆排序

void AdjustDown(DataType* a, size_t n, int parent){//向下调整
    int child = parent * 2 + 1;
    while (child < n){//找到最大的孩子
        if ((child + 1 < n)&&(a[child+1]>a[child]))
            ++child;
        //进行调整
        if (a[child]>a[parent]){
            Swap(&a[child], &a[parent]);
            parent=child;
            child = parent * 2 + 1;
        }
        else
            break;
    }
}

void HeapSort(DataType* a, size_t n)//堆排序,大顶堆{
    assert(a);
    for (int i = (n - 2) / 2; i >= 0; i--)                      
        AdjustDown(a, n, i);//n为元素个数,不是最后一个元素的下表,所以用(n-2)/2
    int end = n - 1;
    while (end > 0){
        Swap(&a[0], &a[end]);
        AdjustDown(a, end, 0);//从堆顶开始向下调整,因为有一半已经有序
        --end;
    }
}

五、冒泡排序

void bubbleSort(int arr[], int n){
    int i, j, tmp;
    for(i = 0; i < n - 1; i++)
        for(j = 1; j < n; j++)      
            if(arr[j] < arr[j - 1]){
                tmp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = tmp;
            }
}

六、快速排序

void QuickSort(int *arr, int low, int high){
    if (low < high){
        int i = low;
        int j = high;
        int k = arr[low];
        while (i < j){
            while(i < j && arr[j] >= k) 
                j--;
            if(i < j)
                arr[i++] = arr[j]; 
            while(i < j && arr[i] < k)// 从左向右找第一个大于等于k的数
                i++;
            if(i < j)
                arr[j--] = arr[i];
        }
        arr[i] = k;
        // 递归调用
        QuickSort(arr, low, i - 1);     // 排序k左边
        QuickSort(arr, i + 1, high);    // 排序k右边
    }

其实也可以直接使用C语言提供的qsort进行快排。

int cmpfunc (const void * a, const void * b){
   return ( *(int*)a - *(int*)b );
}
int* QuickSort(int* arr, int arrSize){
    int *ans=(int*)malloc(sizeof(int) * arrSize);//若直接输出原数组则不需要建立新的数组
    qsort(arr,arrSize,sizeof(int),cmpfunc);
    for(int i = 0;i < k;i++)//若直接输出原数组则不需要转译新的数组
        ans[i] = arr[i];
    return ans;//若直接输出原数组则return arr
}

七、归并排序

void merge(int arr[], int l, int mid, int r){
    int len,i, pl, pr;
    int *tmp = NULL;
    len = r - l + 1;
    tmp = (int*)malloc(len * sizeof(int));  
    memset(tmp, 0x0, len * sizeof(int));
    pl = l;
    pr = mid + 1;
    i  = 0;
    while(pl <= mid && pr <= r) {
        if(arr[pl] < arr[pr]) 
            tmp[i++] = arr[pl++];
        else
            tmp[i++] = arr[pr++];
    }
    while(pl <= mid)
        tmp[i++] = arr[pl++];
    while(pr <= r)
        tmp[i++] = arr[pr++];
    for(i = 0; i < len; i++)
        arr[i+l] = tmp[i];
    free(tmp);
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值