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

如何在排序后将未排序的数组保留在C中

在排序后将未排序的数组保留在C中,可以通过以下步骤实现:

  1. 创建一个原始数组A和一个辅助数组B,它们的大小与待排序数组相同。
  2. 将待排序数组复制到辅助数组B中。
  3. 使用合适的排序算法(如快速排序、归并排序、插入排序等)对辅助数组B进行排序。
  4. 创建一个布尔数组C,大小与待排序数组相同,用于标记数组元素是否已排序。
  5. 遍历原始数组A和排序后的辅助数组B,比较元素并标记C数组中对应位置,如果两个元素相同则标记为已排序。
  6. 遍历布尔数组C,将未排序的元素重新放回原始数组A中,保持它们的相对顺序。

以下是一个示例代码(使用快速排序算法):

代码语言:txt
复制
#include <stdio.h>
#include <stdbool.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[high];
    int i = low - 1;
  
    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}

void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

void retainUnsortedArray(int arr[], int size) {
    int* temp = malloc(size * sizeof(int));
    bool* sorted = malloc(size * sizeof(bool));
    
    for (int i = 0; i < size; i++) {
        temp[i] = arr[i];
        sorted[i] = false;
    }
    
    quickSort(temp, 0, size - 1);
    
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            if (arr[i] == temp[j]) {
                sorted[j] = true;
                break;
            }
        }
    }
    
    int index = 0;
    for (int i = 0; i < size; i++) {
        if (!sorted[i]) {
            arr[index++] = temp[i];
        }
    }
    
    free(temp);
    free(sorted);
}

int main() {
    int arr[] = {5, 2, 1, 4, 3};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    retainUnsortedArray(arr, size);
    
    printf("Unsorted array retained: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

输出结果为:Unsorted array retained: 5 2 1 4 3

该方法使用了快速排序算法对辅助数组进行排序,并通过布尔数组标记已排序的元素。然后根据布尔数组的标记,将未排序的元素重新放回原始数组中,保持它们的相对顺序。

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

  • 云服务器CVM:https://cloud.tencent.com/product/cvm
  • 云数据库CDB:https://cloud.tencent.com/product/cdb
  • 云原生容器服务TKE:https://cloud.tencent.com/product/tke
  • 腾讯云存储COS:https://cloud.tencent.com/product/cos
  • 腾讯云人工智能AI:https://cloud.tencent.com/product/ai
  • 物联网通信平台IoT Hub:https://cloud.tencent.com/product/iothub
  • 移动应用开发平台MTP:https://cloud.tencent.com/product/mtp
  • 腾讯云区块链服务BCS:https://cloud.tencent.com/product/bcs
  • 腾讯云游戏多媒体引擎MME:https://cloud.tencent.com/product/mme
  • 腾讯云音视频处理服务VOD:https://cloud.tencent.com/product/vod
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言每日一题(21)删除排序数组重复项

力扣 26.删除排序数组重复项 题目描述 给你一个 非严格递增排列 数组 nums ,请你 原地 删除重复出现元素,使每个元素 只出现一次 ,返回删除数组新长度。...元素 相对顺序 应该保持 一致 。然后返回 nums 唯一元素个数。...考虑 nums 唯一元素数量为 k ,你需要做以下事情确保你题解可以被通过: 更改数组 nums ,使 nums 前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现顺序排列。...思路分析 基于双指针法,用下标进行代替,从数组最左端开始,遍历整个数组,下标1如果不等于下标2就把下标1指向值赋给下标2,同时继续向后遍历完整个数组,最后返回下标2值(即去重数组长度) 整体步骤...1.定义src下标和dest下标,dest从0开始 src从1开始(第一个不需要进行匹配)遍历整个数组,如果nums【src】不等于nums【dest】就将src指向值赋给dest(先++在赋值)

14010
  • Js数组对象某个属性值升序排序,并指定数组某个对象移动到数组最前面

    需求整理:   本篇文章主要实现一个数组对象属性值通过升序方式排序,然后能够让程序可以指定对应数组对象移动到程序最前面。...: 23},{name: "小芳", Id: 18}];   首先把数组Id值通过升序方式排序: //源数组 var arrayData= [{name: "夏明", Id:24}, {name:...1; } else { return 0; } } } var newArrayData=arrayData.sort(compare('Id'));//通过Id排序完成数组...console.log(newArrayData); 排序完成输出值: [{ name: "大袁", Id: 22 }, { name: "大姚", Id: 23 }, { name: "夏明"...,现在我们需要移除Id=23对象,让其排到最前面去(先找到对象下标,然后把给数组对象赋值给temporaryArry临时数组,然后在通过下标移除newArrayData该对象值,最后arrayData

    12.2K20

    C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 一、二 模型数据拷贝到 三 模型排序 )

    自定义二级指针 ---- 指针数组 和 二维数组 数据 拷贝到 自定义二级指针 内存模型 , 并进行排序 ; 1、函数形参 设计规则 函数形参 设计规则 : 向 函数 传入 二级指针...char **p3 = NULL; 退化为 : // 二维指针 char **p3 代码示例 : /** * @brief copy_data 指针数组 和 二维数组 数据拷贝到... 指针变量元素个数 * @param p2 二维数组 , 最高维退化成 指针 , 整体退化成 数组指针 , 指向数组指针 * @param count2 二维数组 一维数组 个数 * @...字符串 数据 strcpy(p3[i], p1[i]); } // 遍历 p2 二维数组 数据 拷贝到 二级指针 // 之前已经拷贝了 count1...char **p3 = NULL; // 存储 p3 指向一级指针个数 int len3 = 0; // 指针数组 二维数组 数据 拷贝到 二级指针

    60920

    快速排序JavaScript实现详解

    数组分解步骤如下图所示: ? 快速排序 在算法步骤1被选为基准元素带颜色。分区,基准元素始终处于数组正确位置。...我们需要一种跟踪剩下排序数组方法。一种方法是简单地把“成对”元素保留在堆栈,用来表示给定排序数组 start 和 end。...= []; // 整个初始数组做为“排序数组” stack.push(0); stack.push(arr.length - 1); //...stack.push(pivotIndex - 1); } // 如果基准右侧有排序元素, // 则将该子数组添加到栈,以便稍后对其进行排序...快速排序 在图中也把最后一个元素作为基准。给定数组分区,递归遍历左侧,直到将其完全排序为止。然后对右侧进行排序。 快速排序效率 现在讨论它时间和空间复杂度。

    3.3K40

    算法基础:五大排序算法Python实战教程

    一起看一下前6种排序算法,看看如何在Python实现它们。 冒泡排序 冒泡排序通常是在CS入门课程,因为它清楚地演示了排序是如何工作,同时又简单易懂。...通过选择排序,我们输入列表/数组分为两部分:已经排序子列表和剩余要排序子列表,它们构成了列表其余部分。我们首先在排序子列表中找到最小元素,并将其放置在排序子列表末尾。...因此,我们不断地获取最小排序元素,并将其按排序顺序放置在排序子列表。此过程重复进行,直到列表完全排序。 ? ? 插入排序 插入排序比冒泡排序和选择排序既快又简单。...它简单地使用了这种算法两个主要步骤: (1)连续划分排序列表,直到有N个子列表,其中每个子列表有1个“排序”元素,N是原始数组元素数。...(2)重复合并,即一次两个子列表合并在一起,生成新排序子列表,直到所有元素完全合并到一个排序数组。 ? ? 快速排序 快速排序也是一种分而治之算法,归并排序

    1.4K40

    算法基础:五大排序算法Python实战教程

    让我们看一下前6种排序算法,看看如何在Python实现它们! 冒泡排序 冒泡排序通常是在CS入门课程,因为它清楚地演示了排序是如何工作,同时又简单易懂。...通过选择排序,我们输入列表/数组分为两部分:已经排序子列表和剩余要排序子列表,它们构成了列表其余部分。我们首先在排序子列表中找到最小元素,并将其放置在排序子列表末尾。...因此,我们不断地获取最小排序元素,并将其按排序顺序放置在排序子列表。此过程重复进行,直到列表完全排序。 ? ? 插入排序 插入排序比冒泡排序和选择排序既快又简单。...归并排序 归并排序是分而治之算法完美例子。它简单地使用了这种算法两个主要步骤: (1)连续划分排序列表,直到有N个子列表,其中每个子列表有1个“排序”元素,N是原始数组元素数。...(2)重复合并,即一次两个子列表合并在一起,生成新排序子列表,直到所有元素完全合并到一个排序数组。 ? ? 快速排序 快速排序也是一种分而治之算法,归并排序

    1.5K30

    Python算法——插入排序

    插入排序(Insertion Sort)是一种简单但有效排序算法,它基本思想是数组分成已排序排序两部分,然后逐一排序部分元素插入到已排序部分正确位置。...插入排序工作原理 插入排序基本思想是数组分成两部分:已排序部分和排序部分。在开始时,已排序部分只包含数组第一个元素,而排序部分包含剩余元素。...c第四步:已排序部分 [5, 11, 12, 13],排序部分 [6], 6 插入已排序部分。...arr = [12, 11, 13, 5, 6] insertion_sort(arr) print("排序数组:", arr) 时间复杂度 插入排序时间复杂度为 O(n^2),其中 n 是数组长度...尽管插入排序不如高级排序算法(快速排序和归并排序)高效,但它在小型数据集上表现良好,尤其在数组部分有序情况下。

    13010

    程序员必备50道数据结构和算法面试题

    编码面试主要包括数据结构和基于算法问题,以及一些诸如如何在不使用临时变量情况下交换两个整数这样逻辑问题? 我认为编程面试问题划分到不同主题区域是很有帮助。...我在面试中经常看到主题区域是数组、链表、字符串、二叉树,以及源于算法问题(例如字符串算法,排序算法, quicksort 或基数排序,以及其他杂项),这就是你能在这篇文章中找到主要内容。...为了创建一个更长或者更短数组,你需要创建一个新数组,然后所有元素从旧数组复制到新数组。...3、在一个排序整型数组,如何找到最大和最小数字? 4、在一个整型数组,如何找到一个所有成对数字,满足它们和等于一个给定数字?...5、在排序链表,怎样移除重复节点? 6、怎样找出单个链表长度? 7、从单个链表结尾处,怎样找出链表第三个节点? 8、怎样使用栈计算两个链表和?

    4.2K20

    程序员必备50道数据结构和算法面试题

    编码面试主要包括数据结构和基于算法问题,以及一些诸如如何在不使用临时变量情况下交换两个整数这样逻辑问题? 我认为编程面试问题划分到不同主题区域是很有帮助。...我在面试中经常看到主题区域是数组、链表、字符串、二叉树,以及源于算法问题(例如字符串算法,排序算法, quicksort 或基数排序,以及其他杂项),这就是你能在这篇文章中找到主要内容。...为了创建一个更长或者更短数组,你需要创建一个新数组,然后所有元素从旧数组复制到新数组。...3、在一个排序整型数组,如何找到最大和最小数字? 4、在一个整型数组,如何找到一个所有成对数字,满足它们和等于一个给定数字?...5、在排序链表,怎样移除重复节点? 6、怎样找出单个链表长度? 7、从单个链表结尾处,怎样找出链表第三个节点? 8、怎样使用栈计算两个链表和?

    3.2K11

    插入排序:简单而有效排序方法

    本文详细解释插入排序原理和步骤,并提供Java语言实现示例。 插入排序原理及性能分析 插入排序核心思想是逐个排序元素插入到已排序部分,构建有序序列。...insertionSort.png 插入排序步骤 插入排序步骤可以简单概括为以下几个阶段: 初始状态:数组第一个元素视为已排序部分,其余部分为排序部分。...第一次数组第一个元素视为已排序部分, // 每次排序部分第一个元素插入到已排序部分。...// 打印每趟排序完成数组状态,以便查看排序进度 System.out.println("第"+i+"趟排序完成数组:"+ Arrays.toString(arr));...插入排序算法核心思想是逐个排序元素插入到已排序部分,直到整个数组排序完成。

    20531

    数据结构与算法-十大排序算法(动画演示)

    从已排序元素往前扫描,如果扫描到元素大于取出元素Key,将该元素移动下一位置; (3). 如果扫描已排序元素,某个元素小于或等于元素Key,则将Key插入该元素之后; 2....每一趟下来,都会将一个当前比较大数按顺序排到后面应有的位置,排完所有的趟数排序完成。 2. 动画演示 黄色表示已排序部分,蓝色表示排序部分。 ? 3....临时下标归零 t = 0; // 处理数据赋值到原数组 while (low <= high){ arr[low++] = temp[t++];...对辅助空间 C[r] 内统计数字进行计算,每一个统计数字等于与前一个统计数字和,以确定值为 x 在数组位置; (4)....反向遍历原始数组序列每一个数,设当前数减最小数值为y,C[y]值减1为这个数在有序序列位置,同一个数每重复出现一次,将对应C[y]位置减1,遍历完成所有数即为有序序列。 2.

    72720

    理想汽车前端面试题详解,面试经验分享

    reverse() - 数组元素顺序颠倒,第一个元素变成最后一个,最后一个变成第一个。 sort() - 对数组元素进行排序,并原地修改数组(不创建新数组)。...分区操作(Partitioning):重新排列数组,使得所有比基准小元素都在基准左边,所有比基准大元素都在基准右边。 递归排序:对基准左边和右边数组分别进行快速排序。...组合:由于快速排序是就地排序,一旦子数组排序,整个数组也就排序完成了。...执行微任务(Microtask)队列:在执行同步任务过程,如果遇到微任务( Promise 回调函数、queueMicrotask 方法等),则将其添加到微任务队列。...更新渲染:在浏览器环境,如果当前任务完成需要更新页面的渲染,会执行渲染操作。重复上述步骤:事件循环会不断重复执行上述步骤,直到所有任务都被处理完毕

    6100

    七大经典、常用排序算法原理、Java 实现以及算法分析

    一趟冒泡排序下来至少会让一个元素排好序(元素排序区域相当于有序区,因此冒泡排序相当于待排序数组分成了两个已排序区间和排序区间)。...插入排序 **插入排序中将数组元素分成两个区间:已排序区间和排序区间(最开始时候已排序区间元素只有数组第一个元素),插入排序就是排序区间元素依次插入到已排序区间(需要保持已排序区间有序...使用两个临时数组 X 和 Y,遍历 begin 到 end 之间数据,小于 pivot 数据都放到数组 X 大于 pivot 数据都放到数组 Y ,最后数组 X 拷贝到原数组,然后再放入...之后我们从往前依次扫描数据 A(从往前是为了稳定),比如扫描到 3 时候,从数据 C 取出下标为 3 值,是7(也就说到目前为止,包含自己在内,值小于等于 3 数据个数有 7 个),那么 3...当然 3 放入到数组 R C[3] 要减 1,变成 6,表示此时排序数据中小于等于 3 数据个数有 6 个。

    71010

    重读算法导论之算法基础

    原理: 整个过程中将数组元素分为两部分,已排序部分A和排序部分B 插入过程,从未排序部分B取一个值插入已排序部分A 插入过程采用方式为: 依次从A中下标最大元素开始和B取出元素进行对比...完成该轮迭代之后,因为A原来就是排好序,所以只是A不符合条件元素右移,不会影响其排好序特性。...\)(1) 解决:解决过程是递归地解决n/2规模问题,需要2T(n/2)运行时间 合并:每一次合并其实就是遍历左右数组元素,可以认为: C(n) = \(\Theta\)(n) ​ 我们为了分析总运行时间...,只不过选择排序是每次遍历排序部分选择最小元素,冒泡排序时对排序部分依次两两对比。...假定修改算法最坏情况运行时间为Θ(nk+nlg(n/k)),要使修改算法与标准归并排序具有相同运行时间,作为n一个函数,借助Θ记号,k最大值是什么? 在实践,我们应该如何选择k?

    920100

    别再忽视数组排序重要性了

    很多开发者可能会认为排序只是一个简单操作,但实际上,实现一个高效、稳定、可扩展排序算法并不容易。因此,在本文中,我想探讨一下为什么数组排序如此重要,以及如何在Java实现各种排序算法。...插入排序  插入排序是一种简单排序算法。它通过排序元素插入已排序序列来对数组进行排序。该算法时间复杂度为O(n^2)。...代码实现,for循环遍历排序序列,i位置元素作为key,key插入到已排序区间正确位置,即将key与已排序区间中元素从往前进行比较,将比key大元素往后移动一位。...当已排序区间中找到一个比key小元素时,key插入到该元素后面即可。时间复杂度为O(n^2)。选择排序  选择排序是一种简单排序算法。它通过选择排序元素最小值来对数组进行排序。...其中包含了不同种类排序算法,冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序。程序会将一个包含9个元素整型数组传入这些排序算法中进行排序,并输出排序结果。

    22331

    【地铁上面试题】--基础部分--数据结构与算法--排序和搜索算法

    插入元素到合适位置:当前元素插入到已排序序列适当位置,使得插入序列仍然有序。 重复上述步骤:继续遍历排序元素,重复进行插入操作,直到所有元素都被插入到正确位置。...最小(或最大)元素与排序区间第一个元素交换位置。 缩小排序区间范围,排序区间长度增加1。 重复执行上述步骤,直到排序区间为空。...在优化快速排序算法,使用尾递归或迭代方式可以空间复杂度降低为O(logn)。 Tip:快速排序是一种原地排序算法,即不需要额外空间来存储排序结果,而是在原始数组上进行排序。...归并排序空间复杂度是O(n),其中n表示待排序数组大小。在合并过程,需要额外存储空间来存储临时数组。在每次合并操作,需要创建一个临时数组,用于存储合并有序数组。...遍历数组每个元素: 若当前元素已经存在于哈希表,则为重复元素,返回结果。 否则,当前元素添加到哈希表。 若遍历完整个数组仍未找到重复元素,则返回不存在重复元素结果。

    23010
    领券