首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用C对数组进行排序(小元素在边缘,大元素在中间)

要用C语言对数组进行排序,可以使用一种基于比较的排序算法,如快速排序或归并排序。以下是一个示例代码,实现了将小元素放在数组边缘,大元素放在中间的排序效果:

代码语言:txt
复制
#include <stdio.h>

// 交换两个元素的值
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 快速排序的分区函数
int partition(int arr[], int low, int high) {
    int pivot = arr[low];
    int i = low, j = high + 1;

    while (1) {
        // 从左向右找到第一个大于等于pivot的元素
        while (arr[++i] < pivot) {
            if (i == high) break;
        }

        // 从右向左找到第一个小于等于pivot的元素
        while (arr[--j] > pivot) {
            if (j == low) break;
        }

        // 如果i和j相遇,则退出循环
        if (i >= j) break;

        // 交换i和j对应的元素
        swap(&arr[i], &arr[j]);
    }

    // 将pivot放到正确的位置
    swap(&arr[low], &arr[j]);

    // 返回pivot的位置
    return j;
}

// 快速排序
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        // 划分数组,并获取pivot的位置
        int pivotIndex = partition(arr, low, high);

        // 分别对左右子数组进行快速排序
        quickSort(arr, low, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, high);
    }
}

// 打印数组
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {4, 2, 6, 8, 1, 9, 3, 5, 7};
    int size = sizeof(arr) / sizeof(arr[0]);

    printf("原始数组: ");
    printArray(arr, size);

    // 使用快速排序对数组进行排序
    quickSort(arr, 0, size - 1);

    printf("排序后的数组: ");
    printArray(arr, size);

    return 0;
}

这段代码使用了快速排序算法对数组进行排序。快速排序是一种常用的排序算法,其时间复杂度为O(nlogn),是一种高效的排序算法。在快速排序的实现中,通过选择一个基准元素,将数组划分为两个子数组,然后对子数组进行递归排序。通过不断地划分和排序,最终实现整个数组的排序。

对于本题要求的将小元素放在边缘,大元素放在中间的排序效果,可以通过选择一个合适的基准元素,使得在划分数组时,小于等于基准元素的元素被放在一侧,大于基准元素的元素被放在另一侧。这样,最终排序结果就可以达到题目要求的效果。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器CVM:腾讯云提供的弹性计算服务,可用于部署和运行各类应用。
  • 弹性容器实例TKE:腾讯云提供的容器化部署和管理服务,便于快速构建和扩展应用。
  • 对象存储COS:腾讯云提供的安全可靠的对象存储服务,适用于存储和管理大规模的非结构化数据。

注意:由于要求不提及特定的云计算品牌商,上述链接仅为腾讯云相关产品的示例,实际使用时请根据需求选择合适的云计算产品。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【一天一 lee】排序数组中查找元素的第一个和最后一个位置 (难度:中等) - Day20201201

    20201201 题目: 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。...如果数组中不存在目标值 target,返回 [-1, -1]。 进阶: 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?...输入:nums = [], target = 0 输出:[-1,-1] 提示: 0 <= nums.length <= 105 -109 <= nums[i] <= 109 nums 是一个非递减数组...-109 <= target <= 109 抛砖引玉 思路: 一遍循环 一遍循环,记录数组中等于 target 元素的位置,如果变量到元素大于 target,则终止循环,直接返回结果 抛砖引玉 /**...return [left, right] } else { return [-1, -1] } } 博客: 前端小书童 每天的每日一题,写的题解会同步更新到公众号一天一

    37210

    有趣的算法(七) ——快速排序改进算法

    步骤如下: 1)随机选其中一个元素,假设为a[i],将所有值比a[i]元素,移到a[i]的左边,假设为数组b;所有比a[i]元素,移到a[i]的右边,假设为数组c。...二、问题分析 快速排序众多排序算法中,属于非常优秀的算法,不过这几十年来,还是有许多人进行贡献,提供了一些很好的改进。...结束循环后,将a[i]和a[q]进行互换,实现将切分元素换到数组中间位置。...代码如下: /** * 获取快速排序的切分元素,并进行部分排序,保证切分元素左侧元素,右侧都 */ private static int partition(Comparable...经过上述方法,获取切分元素的同时,实际上已经完成了以切分元素值为中值,对数组进行的切分。 如下图所示: ? 2、小数组排序数组元素较少,不采用快速排序

    1.2K40

    算法可视化:把难懂的代码画进梵高的星空

    每一条线代表一个数字,数字向左倾斜,数字就向右倾斜。(请注意,你可以对一组任何东西进行洗牌,不只是数字,但这种可视化编码对于显示元素的顺序很管用。...它的灵感来自于Robert Sedgwick的《C语言实现的算法》中的排序可视化。 该算法把数组划分为两个部分,右半边是已洗牌区域(黑色表示),左半边是待洗牌区域(灰色表示)。...这个额外的空间用于归并排序的子数组,把来自子数组的每对元素组合在一起,同时保持顺序。由于归并排序运行副本而不是交换,因此我们必须相应地修改动画(或有误导读者的风险)。 归并排序自下而上进行。...最初,它合并大小为1的子数组,因为它们经过了排序。每个相邻的子数组:首先,只是一元素,使用额外的数组合并为大小为2的排序数组。然后,将大小为2的每个相邻排序数组合并成大小为4的排序数组。...Prim的算法通常使用堆来实现,这是用于元素进行优先级排序的有效数据结构。 当一个新的单元格加入迷宫时,连接的边缘(以红色标示)被添加到堆。尽管边以任意顺序添加,堆允许快速除去最低加权边。

    1.6K40

    「数据结构与算法Javascript描述」十排序算法

    最后,第二个和第三个元素还会再次互换,得到最终顺序: 「A B D E H」 下图演示了如何一个的数字数据集合进行冒泡排序图中,我们分析了插入数组中的两个特定值:2 和 72。...交换时,我们一个中间值来存储某一交换项的值。其他排序法也会用到这个方法,因此我们声明一个方法swap放置这段交换代码以便重用。 有时候我们循环的中间迭代时已经完成了排序。...然而,实际情况中,归并排序还有一些问题,当我们这个算法一个很大的数据集进行排序时,我们需要相当 的空间来合并存储两个子数组。...接着,算法划分后的小数组(较主元的值组成的子数组,以及较主元的值组成的子数组)重复之前的两个步骤,直至数组已完全排序。...算法的步骤如下: 找出待排序数组中最大和最小的元素 统计数组中每个值为i的元素出现的次数,存入数组C的第i项 所有的计数累加(从C中的第一个元素开始,每一项和前一项相加) 反向填充目标数组:将每个元素

    96920

    排序算法】快速排序升级版--三路快排详解 + 实现(c语言)

    前言 之前我们学习了快速排序算法及其实现: 【排序算法】八排序(下)(c语言实现)(附源码)-CSDN博客 不过它的缺陷也很明显:当数组中存在大量相同元素时,那些与基准值相同的元素的划分方法是未定义的...一、三路快排的整体思路 所谓三路快排,就是从快速排序的划分上,由原来的两部分变为三部分:左边是比基准值的数据;中间是与基准值相同的数据;右边是比基准值的数据。...之前我们的快速排序当中,都是默认将数组元素作为基准值,如果该值是数组的最大值或者最小值,那么划分操作相当于只是将该值进行排序,时间复杂度就会退化为O(N^2)。...所以接下来我们选取基准值时,将会使用三数取中法,将首元素、末元素中间元素进行比较,选取一个中间值作为基准值。 划分的具体步骤如下: 1....]); } return 0; } 总结 快速排序是一种高效且常用的排序算法,但是传统的快排并没有与基准值相同的数据进行明确划分,造成运行效率的降低。

    14910

    TypeScript实现八排序与搜索算法

    前言 我们页面上渲染数据时,通常会根据特定规则来对数据进行一个排序,然后再将其渲染到页面展示给用户。 那么对数据进行排序有很多种方式,哪一种效率高?哪一种稳定性好?那一种占用内存?...左右两部分继续执行分割 合并数组: 我们将数组分割完后,数组进行排序,然后将其合并成大数组并返回。...分布式排序使用已组织好的辅助数据结构,然后进行合并,得到排好序的数组。计数排序使用一个用来存储每个元素原始数组中出现次数的临时数组。...,然后将目标值和找到的值进行大小比较,如果比中间就往中间值的右边找,否则就往中间值的左边找。...实现思路 选择数组中间值 如果选中值是待搜索值,那么算法执行完毕 如果待搜索值比选中值要,则返回步骤1并在选中值左边的子数组中寻找(较小) 如果待搜索值比选中值要,则返回步骤1并在选中值右边的子数组中寻找

    93420

    详解快速排序算法

    快速排序的基本思想是任取待排序序列的一个元素作为中心元素(可以第一个,最后一个,也可以是中间任何一个),习惯将其称为pivot,枢轴元素; 将所有比枢轴元素的放在其左边; 将所有比它的放在其右边...; 形成左右两个子表; 然后左右两个子表再按照前面的算法进行排序,直到每个子表的元素只剩下一个。...将一个数组分成两个数组的方法为: 先从数组右边找到一个比枢轴元素元素,将数组的第一个位置赋值为该元素; 再从数组的左边找到一个比枢轴元素元素,将从上面取元素的位置赋值为该值; 依次进行,直到左右相遇...排序全过程 代码 每一个数组进行分化的代码如下: 初始化pivot为数组第一个元素; 只要left还小于right就进行循环; 外层循环内部如下: 先从右边找一个比枢轴元素元素; 将当前...这样的话,长度为n的数组需要经过n趟划分,这时的时间复杂度为O(n^2); 为改善最坏情况下的时间性能,可以最枢轴元素的原则中进行优化,选第一个元素,最后一个元素中间元素中的中位数即可。

    54560

    夯实基础,常考的数据结构 5 类经典算法

    这里将引入一些著名的算法进行介绍,每一个都是经典,值得收藏。 排序算法(数组排序算法可能是最基础、最适合算法入门的经典算法,面试中经常会问到排序算法及其相关的问题。...如果第一个比第二个,就交换它们两个;每一相邻元素作同样的工作,从开始第一到结尾的最后一,这样最后的元素应该会是最大的数;针对所有的元素重复以上的步骤,除了最后一个;重复上述步骤,直到排序完成...算法描述为:从数列中挑出一个元素,称为"基准",所有比基准值元素摆放在基准前面,所有比基准值元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。...算法思路是:找到数组中间元素坐标并记录,将需要查找的元素中间元素进行比较,如果大于中间元素,则截取中间元素以后的所有元素作为新的数组,将中间元素设为新数组的起始元素,如果小于中间元素,则截取中间元素以前的所有元素作为新的数组...然后再在新的数组中找到中间元素,继续进行比较,如果中间元素等于目标值则返回输出。

    37330

    详解快速排序算法

    快速排序的基本思想是任取待排序序列的一个元素作为中心元素(可以第一个,最后一个,也可以是中间任何一个),习惯将其称为pivot,枢轴元素; 将所有比枢轴元素的放在其左边; 将所有比它的放在其右边;...将一个数组分成两个数组的方法为: 先从数组右边找到一个比枢轴元素元素,将数组的第一个位置赋值为该元素; 再从数组的左边找到一个比枢轴元素元素,将从上面取元素的位置赋值为该值; 依次进行,直到左右相遇...排序全过程 代码 每一个数组进行分化的代码如下: 初始化pivot为数组第一个元素; 只要left还小于right就进行循环; 外层循环内部如下: 先从右边找一个比枢轴元素元素; 将当前left...right进行一次划分,将返回来的值赋值给middle; left到middle - 1的部分进行一次快排(递归进行); middle + 1到right的部分进行一次快排(递归进行)。...这样的话,长度为n的数组需要经过n趟划分,这时的时间复杂度为; 为改善最坏情况下的时间性能,可以最枢轴元素的原则中进行优化,选第一个元素,最后一个元素中间元素中的中位数即可。

    43540

    快速排序算法介绍

    快速排序(QuickSort)是冒泡排序的一种改进。由 C. A. R. Hoare 1962年提出。...它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要,然后再按此方法这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列...现在内存空间比较大的情况下,可以考虑下面这种算法(通过Python代码做了示例): 从数组 A 中取一个中间值 t,创建两个数组B、C,一个(B)用来存放小于 t 的数据,另一个(C)用来存放大于 t...遍历数组 A 并与中间值 t 进行比较,将小于中间值的数据放入数组 B,将大于中间值的数据放入数组 C。 对数组 B、C 按照1、2步进行排序。 将 B、t、C组合后输出为排序后的结果。...保持最大值低于这些关键数据,最小值高于这些关键数据,从而避免已经有序的中间的数据进行重排。完成后,数组中间空位必然空出,把这个buffer写入数组中间空位。

    70810

    万字解析排序算法

    单趟排序后keyi作为中间值换到了两个指针上一轮相遇位置,从keyi位置二分数组,将两个数组的最左边元素设置为keyi,继续进行循环,继续分治,如此最后即达到了整体顺序的目的。...然后,这两部分递归地进行快速排序左部分排序基准值左边的子数组递归调用快速排序右部分排序基准值右边的子数组递归调用快速排序。...挖坑填数:通过一趟排序将待排序数组分割成独立的两部分,分别是比基准值元素和比基准值元素。...递归处理: 基准值被换到上一趟最后prev的位置,作为中间值,基准值将数组分为左右两部分,分别为[left, keyi-1]和[keyi+1, right],这两部分分别进行递归快速排序。...int mid = (begin + end) / 2; 递归排序数组: 先左子数组 [begin, mid] 进行排序,再右子数组 [mid + 1, end] 进行排序

    8310

    归并快排算法比较及求第K大元素

    归并排序 核心思想:将数组中间分成前后两部分,然后前后两部分分别进行排序,再将排序好的两个部分有序合并在一起,这样整个数组有序。...全文图示来源于王争的《数据结构和算法之美》 image.png 归并排序使用的就是分治思想。分治,顾名思义,就是分而治之,讲一个的问题分解成的问题来解决,的问题解决了的问题也就解决了。...快速排序 核心思想:选取一个基准元素 pivot,比 pivot 的放到左边,比 pivot 的放到右边, pivot 左右两边的序列递归进行以上操作。...,这里C++实现一遍,这里的 partition 非常巧妙而且容易理解,取最后元素为基准 pivot,i 开始取值 l,j 从 l 遍历至 h-1,当 A[j] < pivot 时,交换 A[i] 和...,而且不需要将数组全部排序,只要求出第 k 的值即可,非常高效。

    90330

    快速排序的优化思路

    在对快速排序进行优化前,先让我们回顾一些快速排序的思想: 快速排序就是分而治之思想的体现,将有序序列分成对立的两部分,一部分值都比关键字值,一部分值都比关键字值,再分别对两部分进行排序 快速排序不了解的可以先看看快速排序的具体过程和代码讲解...int partition(int arr[],int len,int low,int high) { int pivotkey; //数组的第一个元素做关键值 pivotkey = arr[...如果数组非常,其实快速排序不如直接插入排序来得更好(直接插入排序是简单排序中性能最好的) 因为快速排序需要用到递归操作,对于大量数据操作时,这点性能影响对于它的整体算法优势而言可以忽略不计,但如果数组只有几个数据需要排序的时候...)//当high-low大于常数时快速排序 { //获取当前关键值的位置(在数组中的下标) pivot=partition(arr, len, low, high); //分别对关键值前面较小部分和后面较大部分进行排序...小于等于常数时直接插入排序 { //当某一部分子序列长度小于常数时,就用直接插入排序进行排序操作 InsertSort(arr,high,low); } } //升序 void QuickSort

    31630

    经典排序算法总结

    5、选择排序: 选择排序某些地方和冒泡排序相似:第一次选出最大(最小)的元素置于数组开头,第二次选出第二(第二)的元素置于数组第二个位置。。。直到所有的元素都有序。...*/ a[i] = temp; // 把基数放在中间,比基数的数左边,比基数的数右边 quickSort(a, left, i - 1); quickSort(a,...7、归并排序: 其实归并排序和快速排序有点像,因为归并排序也是通过分治递归来实现的,但是归并排序是先通过分治递归将所有的数组元素都分成一个个独立的元素个体,之后通过合并函数按照从小到(从)来进行和并...int b[N]; // 合并两组数中间数组 // 合并左右两边的数组元素数组元素的交换在这里进行 void merge(int left, int mid, int right) {...如果是从进行排序,那么我们需要建立最大堆,然后不断取出堆顶元素进行维护,直到堆为空。

    47320

    一文搞定十经典排序算法

    如果前一个比后一个,就交换它们两个; 2)每一相邻元素作同样的工作,从开始第一到结尾的最后一,这样最后的元素应该会是最大的数; 3)针对所有的元素重复以上的步骤,除了最后一个; 4)重复步骤...这样递归排序区间的时候,我们就不必再第二部分元素均相等的区间进行快排了,这在待排序列存在大量相同元素的情况下能大大提高快排效率。 来看下面的三路划分示意图: ?...此时 a[j] 就是数组的第 j 元素,我们可以转换一下题意,第 k 元素就是第 nums.size() - k 元素。...② 算法描述 1)找出待排序数组中最大和最小的元素; 2)统计数组中每个值为 i 的元素出现的次数,存入数组C的第i项; 3)所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);...4)反向填充目标数组:将每个元素 i 放在新数组的第C(i)项,每放一个元素就将C(i)减去1。

    49120

    程序员必须知道的十基础实用算法及讲解!

    我们一起来看看十基础算法吧~ 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。平均状况下,排序 n 个项目要Ο(nlogn) 次比较。...重新排序数列,所有元素比基准值的摆放在基准前面,所有元素比基准值的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。...搜素过程从数组中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。...算法五:BFPRT(线性查找算法) BFPRT 算法解决的问题十分经典,即从某 n 个元素的序列中选出第 k (第 k )的元素,通过巧妙的分析,BFPRT 可以保证最坏情况下仍为线性时间复杂度。...若 i==k,返回 x;若 ik,大于 x 的元素中递归查找第 i-k 元素。 终止条件:n=1 时,返回的即是 i 元素

    80850
    领券