首页 > 其他分享 >找到数组中第几个最小的数据

找到数组中第几个最小的数据

时间:2023-05-22 19:05:28浏览次数:33  
标签:arr leftp 第几个 int 最小 length swap 数组 center


找到数组中第几个最小的数据 将经典的快速排序算法做简单修改即可

示例代码如下:

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

    int position = 2;
    findSpecificMin(arr, sizeof(arr)/sizeof(int), position - 1, 0);

    printf("\n");
    for (int i = 0; i < sizeof(arr)/sizeof(int); i++) {
        printf("arr is %d\n", arr[i]);
    }

    printf("min is %d\n", arr[position - 1]);

    for (int i = 1; i <= sizeof(arr)/sizeof(int); i++) {

        int position = i;
        findSpecificMin(arr, sizeof(arr)/sizeof(int), position - 1, 0);
        printf("min is %d\n", arr[position - 1]);
    }

}

/** 
 * currentPivot 当前枢纽元的位置
 * specificMin 第几个最小的数
 */
void findSpecificMin(int arr[], int length, int specificMin, int currentPivot){

    if (length <= 1) {
        return;
    }

    if (length == 2) {
        if (arr[0] > arr[1]) {
            swap(arr, arr + 1);
        }
        return;
    }

    int center = (length - 1) / 2;

    if (arr[0] > arr[length - 1]) {
        swap(arr, arr + length - 1);
    }
    if (arr[0] > arr[center]) {
        swap(arr, arr + center);
    }
    if (arr[center] > arr[length - 1]) {
        swap(arr + center, arr + length - 1);
    }

    swap(arr + center, arr + length - 1);

    int pivotElement = arr[length - 1];

    int leftp = 0;
    int rightp = length - 1;

    while (1) {
        while (arr[--rightp] > pivotElement) {

        }
        while (arr[++leftp] < pivotElement) {

        }
        if (rightp > leftp) {
            swap(arr + rightp, arr + leftp);
        }else{
            break;
        }
    }

    swap(arr + leftp, arr + length - 1);

    printf("\n");
    for (int i = 0; i < length; i++) {
        printf("arr is %d\n", arr[i]);
    }

    if (currentPivot + leftp <= specificMin) {
        findSpecificMin(arr + leftp, length - leftp, specificMin, currentPivot + leftp);
    }else{
        findSpecificMin(arr, leftp, specificMin, currentPivot);
    }
}


标签:arr,leftp,第几个,int,最小,length,swap,数组,center
From: https://blog.51cto.com/u_16124099/6326573

相关文章

  • 树状数组学习笔记
    树状数组(BinaryIndexedTree)是一种利用数的二进制特征进行检索的树状结构。树状数组是一种奇妙的数据结构,不仅非常高效,而且代码及其简洁。 #definelowbit(x)((x)&-(x))voidadd(intx,intd){//更新while(x<=n){tree[x]+=d;x+=lowbit(x);}}......
  • 【iOS开发】for in 可变数组 崩溃
    该问题来自一道笔试题:一、执行下面代码会发生什么?什么解决?NSMutableArray*array=[NSMutableArrayarrayWithObjects:@"122",@"333",@"444",nil];for(NSString*stringinarray){[arrayremoveObject:string];}答:会崩溃,提示NSGenericExc......
  • 最小公倍数
    自然语言解决问题:最小公倍数,如果有一个自然数a能被自然数b整除,则称a为b的倍数,为a的约数,对于两个整数来说,指该两数共有倍数中最小的一个。计算最小公倍数时,通常会借助最大公约数来辅助计算。最小公倍数=两数的乘积/最大公约(因)数解题时要避免和最大公约(因)数问题混淆。对于......
  • 【React工作记录五十九】根据key值过滤形成新得数组
     目录前言导语 核心实现代码运行结果前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语根据key......
  • Python 什么是数组?
    在Python中,数组通常是指用于表示具有相同数据类型的多个元素的数据结构。在Python中,数组可以表示为列表或NumPy数组。列表:Python中最常用的数组表示法是“列表”。一个列表是由一系列有序元素的集合组成,每个元素可以是字符串、数字、布尔值和其他任何类型的对象。例如: ......
  • 【算法题】二维数组打印
    链接:https://www.nowcoder.com/questionTerminal/6fadc1dac83a443c9434f350a5803b51有一个二维数组(n*n),写程序实现从右上角到左下角沿主对角线方向打印。(注:主对角线方向为从左上角指向右下角这一斜线的方向)给定一个二位数组arr及题目中的参数n,请返回结果数组。 数......
  • NOI / 1.8编程基础之多维数组 8:肿瘤面积
    描述在一个正方形的灰度图片上,肿瘤是一块矩形的区域,肿瘤的边缘所在的像素点在图片中用0表示。其它肿瘤内和肿瘤外的点都用255表示。现在要求你编写一个程序,计算肿瘤内部的像素点的个数(不包括肿瘤边缘上的点)。已知肿瘤的边缘平行于图像的边缘。输入只有一个测试样例。第一行有一......
  • 字符串与字符数组
    字符数组的定义chararray[100];字符串的初始化chararray[100]={'a','b','c','d'};chararrsy[100]="abcd";chararrsy[100]={0};chararrsy[]="abcd";/*字符类型char多个char类型组成的就是字符串字符使用单引号''......
  • 2.5 数组分配与访问
    基本原则对于数据类型T和整型常数N,声明如下:TA[N];起始位置表示为xa。这个声明有两个效果。首先,它在内存中分配一个L·N字节的连续区域,这里L是数据类型T的大小(单位为字节)。其次,它引入了标识符A,可以用A来作为指向数组开头的指针,这个指针的值就是xa。可以用0~N-1的整数索引来访......
  • 2.索引数组和关联数组,求随机数,递归调用
    总结索引数组和关联数组,字符串处理,高级变量使用及示例。数组1.数组介绍变量:存储单个元素的内存空间数组;存储多个元素的连续的内存空间,相当于多个变量的集合。数组名和索引索引的编号从0开始,属于数组索引索引支持自定义的格式,而不仅是数值格式,即为关联索引。Bash的数组支持稀疏格......