首页 > 其他分享 >c语言解决所有认识的排序(默认升序)

c语言解决所有认识的排序(默认升序)

时间:2024-08-24 19:52:53浏览次数:14  
标签:nums int void 默认 high ++ low 升序 排序

库函数(不讲武德法)

int cmp(const void *a, const void *b) {  

    return *(int*)a-*(int*)b;

}  

调用qsort(nums,numsize,sizeof(int),cmp;

元素什么类型自己改一下就行了。

可以对a,b进行操作降序或者偶奇排序。

选择排序

void a(int *a,int n){

    for(int i=0;i<n;++i){

        int min=i;

        for(int j=i+1;j<n;++j){

            if(a[j]<a[min]){

                min=j;

            }

        }

        int c=a[min];

        a[min]=a[i];

        a[i]=c;

    }

}

选择排序就是先选第一位为最小然后比较第一位,如果有小的就交换,依次比较第二位第三位...

冒泡排序

void a(int *a,int n){

    for(int i=n-1;i>=0;--i){

        for(int j=0;j<i;++j){

            if(a[j]>a[j+1]){

                int c=a[j+1];

                a[j+1]=a[j];

                a[j]=c;

            }

        }

    }

}

把最大的元素冒泡到最右边。第一个和第二个大的在右边然后第二个和第三个.....直至最后一个。

插入排序

void a(int*a,int b){

    for(int i=1;i<b;++i){

        int c=a[i];

        int j=i-1;

        while(j>=0){

            if(c<a[j]){

                a[j+1]=a[j];

                j--;

            }else{

                break;

            }

        }

        a[j+1]=c;

    }

}

第一个和第二个比较如果小于就覆盖交换,第三个再和第二个比较如果小就和第一个比较大了就插入,插入排序就是把元素和前面的比较如果大了就插入到比较元素的下一个位置,如果小了就把比较元素移到下一位。这个是我自己写的可能和书上的不太一样。

计数排序

void a(int *a,int n,int m){

    int *b=(int *)malloc(sizeof(int)*(m+1));

    memset(b,0,sizeof(int)*(m+1));

    for(int i=0;i<n;++i){

        b[a[i]]++;

    }

    int c=0;

    for(int v=0;v<=m;++v){

        while(b[v]>0){

            a[c++]=v;

            b[v]--;

        }

    }

    free(b);

}

如果是负数要重新讨论排序,初始化数组长度为最大加一,把所有置为0,就是把最大元素找出来,如果目标数组有这一个数组就加一没有就下一个,然后把这个数组再赋值给原数组。知道最大值的话可以用这个。

归并排序

void merge(int* nums, int low, int mid, int high, int* arr){

    int i, j, k;

    for(k = low; k <= high; ++k)

        arr[k] = nums[k];

    for(i = low, j = mid+1, k = i; i <= mid && j <= high; ++k){

        if(arr[i] <= arr[j])

            nums[k] = arr[i++];

        else

            nums[k] = arr[j++];

    }

    while(i <= mid)

        nums[k++] = arr[i++];

    while(j <= high)

        nums[k++] = arr[j++];

}

void mergeSort(int* nums, int low, int high, int* arr){

    if(low < high){

        int mid = (low + high) / 2;

        mergeSort(nums, low, mid, arr);

        mergeSort(nums, mid+1, high, arr);

        merge(nums, low, mid, high, arr);

    }

}

int* sortArray(int* nums, int numsSize, int* returnSize){

    int* arr = (int*)malloc(sizeof(int) * numsSize);

    *returnSize = numsSize;

   

    mergeSort(nums, 0, numsSize-1, arr);

    return nums;

}

快速排序

int Partition(int* nums, int low, int high){

    if(low < high){

        int pivot = nums[low];

        while(low < high){

            while(low < high && nums[high] >= pivot)

                --high;

            nums[low] = nums[high];

            while(low < high && nums[low] <= pivot)

                ++low;

            nums[high] = nums[low];

        }

        nums[low] = pivot;

    }

    return low;

}

void QuickSort(int* nums, int low, int high){

    if(low >= high)

        return;

    int pivotpos = Partition(nums, low, high);

    QuickSort(nums, low, pivotpos-1);

    QuickSort(nums, pivotpos+1, high);

}

int* sortArray(int* nums, int numsSize, int* returnSize){

    QuickSort(nums, 0, numsSize-1);

    *returnSize = numsSize;

    return nums;

}

快排应该是用的最多的。随便选一个元素小于他的放左边大的放右边然后再从左边到这个元素找一个元素当新的元素然后递归调用快排。

基数排序

void countingSort(int *array, int size, int exp) {  

    int *output = (int *)malloc(size * sizeof(int));  

    int count[10] = {0};  

    for (int i = 0; i < size; i++) {  

        count[(array[i] / exp) % 10]++;  

    }  

    for (int i = 1; i < 10; i++) {  

        count[i] += count[i - 1];  

    }  

    for (int i = size - 1; i >= 0; i--) {  

        output[count[(array[i] / exp) % 10] - 1] = array[i];  

        count[(array[i] / exp) % 10]--;  

    }  

    for (int i = 0; i < size; i++) {  

        array[i] = output[i];  

    }  

    free(output);  

}  

void radixSort(int *array, int size) {  

    int max = array[0];  

    for (int i = 1; i < size; i++) {  

        if (array[i] > max) {  

            max = array[i];  

        }  

    }  

    for (int exp = 1; max / exp > 0; exp *= 10) {  

        countingSort(array, size, exp);  

    }  

}

按位数进行排序就是分类的。

桶排序

void bucketSort(float *array, int size) {  

    int BUCKET_SIZE = 10;  

    float **buckets = (float **)malloc(BUCKET_SIZE * sizeof(float *));  

    int *bucketSizes = (int *)calloc(BUCKET_SIZE, sizeof(int));  

    for (int i = 0; i < BUCKET_SIZE; i++) {  

        buckets[i] = (float *)malloc(size * sizeof(float));  

    }  

    for (int i = 0; i < size; i++) {  

        int bucketIndex = array[i] * BUCKET_SIZE;  

        buckets[bucketIndex][bucketSizes[bucketIndex]++] = array[i];  

    }  

    for (int i = 0; i < BUCKET_SIZE; i++) {  

        if (bucketSizes[i] > 0) {  

            qsort(buckets[i], bucketSizes[i], sizeof(float), (int (*)(const void *, const void *))compare);  

        }  

    }  

    int index = 0;  

    for (int i = 0; i < BUCKET_SIZE; i++) {  

        for (int j = 0; j < bucketSizes[i]; j++) {  

            array[index++] = buckets[i][j];  

        }  

    }  

    for (int i = 0; i < BUCKET_SIZE; i++) {  

        free(buckets[i]);  

    }  

    free(buckets);  

    free(bucketSizes);  

}  

int compare(const void *a, const void *b) {  

    return (*(float *)a - *(float *)b);  

}  

把所有元素放在几个桶里面排序,内存少可以用。

标签:nums,int,void,默认,high,++,low,升序,排序
From: https://blog.csdn.net/2303_78076382/article/details/141472427

相关文章

  • C语言新手小白详细教程:冒泡排序
    ......
  • 数据结构--排序--C语言
    文章目录数据结构---排序一、排序的概念及其运用1、排序的概念2、排序运用二、常见的排序算法1、插入排序直接插入排序:希尔排序(缩小增量排序)2、选择排序直接选择排序:堆排序3、交换排序冒泡排序快速排序将区间按照基准值划分为左右两半部分的常见方式有:快速排序优......
  • 【排序算法】八大排序(下)(c语言实现)(附源码)
    ......
  • REST framework:排序过滤器的使用
    对于列表数据,RESTframework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序1、在setting中的REST_FRAMEWORK添加配置'DEFAULT_FILTER_BACKENDS':(#这个是指定使用django_filters中的过滤器来进行过滤'django_filters.rest_framework.DjangoFilte......
  • dotnet 默认创建的 JsonContent 没有 Content Length 的内容头
    本文记录一个dotnet的设计问题,默认创建出来的JsonContent对象的Headers里,是没有Content-Length信息的如下面代码创建一个JsonContent对象usingSystem.Net.Http.Json;varfoo=newFoo();varjsonContent=JsonContent.Create(foo);classFoo{publicin......
  • 八大排序一些总结
    基于比较的排序时间复杂度空间复杂度稳定性选择排序O(N^2)O(1)无冒泡排序O(N^2)O(1)有插入排序O(N^2)O(1)有归并排序O(N*logN)O(N)......
  • 每天学习一个基础算法之选择排序
    目录前言:一、选择排序的基本思路和实现方法1、基本思路2、实现方法二、选择排序的执行过程示意图三、选择排序的实现代码选择排序代码主体(以接口函数的形式)测试部分(主函数调用) 四、对选择排序复杂度的分析背景知识:1、选择排序的时间复杂度 精确计算:*采用大O......
  • 交换排序(冒泡排序和快速排序)
    一、基本思想所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。二、冒泡排序1.核心思想两两相邻的元素进行比较2.动图展示3.代码展示voidSwap(int*......
  • set 的详细用法(set 排序、set 的遍历、set 的多种倒序遍历方法、set 的基本成员函数)
    目录一:set的简介二:set的使用(要包含头文件)1.set的定义2.set的基本成员函数3.set的遍历(1)迭代器iterator(即升序输出)(2)倒序输出1.rbegin()和rend()2.当然,也可以逆向思维一下。​^^3.用greater实现降序排列三:应用基本成员函数的代码【总结】有上述代码可以看出,插......
  • (算法)计算右侧⼩于当前元素的个数————<分治-归并排序>
    1.题⽬链接:315.计算右侧⼩于当前元素的个数2.题⽬描述:3.解法(归并排序):算法思路:这⼀道题的解法与求数组中的逆序对的解法是类似的,但是这⼀道题要求的不是求总的个数,⽽是要返回⼀个数组,记录每⼀个元素的右边有多少个元素⽐⾃⼰⼩。但是在我们归并排序的过程中,元素的下......