【C语言】选择排序+求出以前数组的位置

 1. 对负数数组取绝对值进行排序(从大到小)

#include<stdio.h>
#include<math.h>
void SelectionSort(int *arr, int n) 
{
    for (int i = 0; i < n; i++) 
    {
        int Maxkey = abs(arr[i]); 
        for(int j=i; j<n; j++)
        {
            if(Maxkey<abs(arr[j]))
            {
                int temp = abs(arr[j]);
                arr[j]=abs(Maxkey);
                Maxkey=abs(temp);
            }
        }
        arr[i]=abs(Maxkey);
    }
}

int main() {
    int a[] = {-12,-7,-9,-22,-22,-88,-4,-1,1,-1,-53};
    int n = sizeof(a)/sizeof(int);
    InsertSort(a, n);
    printf("The sorted array is:");
    for (int i = 0; i < n; i++) {
        printf(" %d", a[i]);
    }
    printf("\n");
    return 0;
}

2. 对负数数组取绝对值进行排序(从小到大)

#include<stdio.h>
#include<math.h>
void SelectionSort(int *arr, int n) 
{
    for (int i = 0; i < n; i++) 
    {
        int Minkey = abs(arr[i]); 
        for(int j=i; j<n; j++)
        {
            if(Minkey>abs(arr[j]))
            {
                int temp = abs(arr[j]);
                arr[j]=abs(Minkey);
                Minkey=abs(temp);
            }
        }
        arr[i]=abs(Minkey);
    }
}

int main() {
    int a[] = {-12,-7,-9,-22,-22,-88,-4,-1,1,-1,-53};
    int n = sizeof(a)/sizeof(int);
    SelectionSort(a, n);
    printf("The sorted array is:");
    for (int i = 0; i < n; i++) {
        printf(" %d", a[i]);
    }
    printf("\n");
    return 0;
}

 2.1 在keil5中需要包括头文件

#include <math.h>
#include <stdlib.h>//abs
void SelectionSort(int8_t *arr, int8_t n) 
{
    int8_t Minkey;
    int8_t temp;
    for (int8_t i = 0; i < n; i++) 
    {
        Minkey = abs(arr[i]); 
        for(int j=i; j<n; j++)
        {
            if(Minkey>abs(arr[j]))
            {
                temp = abs(arr[j]);
                arr[j]=abs(Minkey);
                Minkey=abs(temp);
            }
        }
        arr[i]=abs(Minkey);
    }
}

 2.2 sizeof(array)/sizeof(int)

array是个数组,
sizeof (array)就是这个数组所占的内存总量(字节数),
sizeof(int)就是单个所占的内存。
所以,sizeof(array)/sizeof(int)就是array数组的元素的个数。

3. 求一维数组最大值的位置

求出数组长度,设立一个变量imax记录当前最大值的下标;对数组进行遍历比较,总是把最大值的下标赋给imax,遍历完成后imax即为所求位置。

#include<stdio.h>
int main(void){
    int a[]={1,6,18,19,13,5,2,-20,30,4,12,14,15,16,17,7,8,9,10,11},i,imax,ln;
    ln=sizeof(a)/sizeof(int);
    for(i=imax=0;i<ln;i++)
        if(a[imax]<a[i])
            imax=i;
    printf("The maximum is the subscript of %d elements.\n",imax);
    return 0;
}

4. 求一维数组最小值的位置

#include<stdio.h>
int main(void){
    int a[]={1,6,18,19,13,5,2,-20,30,4,12,14,15,16,17,7,8,9,10,11},i,imin,ln;
    ln=sizeof(a)/sizeof(int);
    for(i=imin=0;i<ln;i++)
        if(a[imin]>a[i])
            imin=i;
    printf("The minimum is the subscript of %d elements.\n",imin);
    return 0;
}

5. 求一维数组绝对值最小值的位置

#include<stdio.h>
#include<math.h>
int main(void){
    int a[]={4,6,18,19,13,5,2,-20,30,4,12,1,-1,16,17,7,8,9,10,11},i,imin,ln;
    ln=sizeof(a)/sizeof(int);
    for(i=imin=0;i<ln;i++)
        if(a[imin]>abs(a[i]))
            imin=i;
    printf("The minimum is the subscript of %d elements.\n",imin);
    return 0;
}

这种算法只能求出数组左边的最小值,如果数组中有两个最小值,那么求出的数组位置就是左面最小值的位置。

6. 用C语言对一维数组排序,并输出原来的位置

可以先用冒泡排序对数组进行排序,然后对排序的数组进行遍历,找出其在排序之前数组中的位置

 这种方法对于重复数组效果就不行了,因为它总是与第一个重复元素进行比较,如何值比较一次呢?

#include<stdio.h>
#include <cstring>
void SelectionSort(int *arr, int n) 
{
    for (int i = 0; i < n; i++) 
    {
        int Minkey = arr[i]; 
        for(int j=i; j<n; j++)
        {
            if(Minkey>arr[j])
            {
                int temp = arr[j];
                arr[j]=Minkey;
                Minkey=temp;
            }
        }
        arr[i]=Minkey;
    }
}

int main() {
    int a[] = {5,1,1,1,1,0,1,1,1,2};
    int b[10];
    int c[10];
    int k;
    int n = sizeof(a)/sizeof(int);
    memcpy(&b, &a, sizeof(a));
    SelectionSort(a, n);
    printf("The sorted array is:");
    printf("\n");
    for (int i = 0; i < n; i++) {
        printf(" %d", b[i]);
    }
    printf("\n");
    for (int ip = 0; ip < n; ip++) {
        printf(" %d", a[ip]);
    }
    printf("\n");
    for (int ii=0;ii<n;ii++)
    {
        for (int j=0;j<n;j++)
        {
            if (a[ii]==b[j])
            {
                c[k++] = j; //因为说的是第几位而不是下标
                break;
            } 
        }
    }
    for (int iii=0;iii<n;iii++)
    {
        printf("%d ",c[iii]);
    }
    printf("\n");
    return 0;
}

 改进:

#include<stdio.h>
#include <cstring>
void SelectionSort(int *arr, int n) 
{
    for (int i = 0; i < n; i++) 
    {
        int Minkey = arr[i]; 
        for(int j=i; j<n; j++)
        {
            if(Minkey>arr[j])
            {
                int temp = arr[j];
                arr[j]=Minkey;
                Minkey=temp;
            }
        }
        arr[i]=Minkey;
    }
}

int main() {
    int z1=0,z2=1,z3=2,z4=3,z5=4;
    int a[] = {1,2,1,1,-3};
    int b[10];
    int c[10];
    int k = 0;
    int n = sizeof(a)/sizeof(int);
    memcpy(&b, &a, sizeof(a));
    SelectionSort(a, n);
    printf("The sorted array is:");
    printf("\n");
    for (int i = 0; i < n; i++) {
        printf(" %d", b[i]);
    }
    printf("\n");
    for (int ip = 0; ip < n; ip++) {
        printf(" %d", a[ip]);
    }
    printf("\n");
    for (int ii=0;ii<n;ii++)
    {
        if(a[ii] == b[z1])
        {
            c[k++]=z1;
            z1=10;
        }
        else if(a[ii] == b[z2])
        {
            c[k++]=z2;
            z2=10;
        }
        else if(a[ii] == b[z3])
        {
            c[k++]=z3;
            z3=10;
        }
        else if(a[ii] == b[z4])
        {
            c[k++]=z4;
            z4=10;
        }
        else if(a[ii] == b[z5])
        {
            c[k++]=z5;
            z5=10;
        }
    }
    for (int iii=0;iii<n;iii++)
    {
        printf("%d ",c[iii]);
    }
    printf("\n");
    return 0;
}

void HeatingChannelArray(void)
{
    int z0=0,z1=1,z2=2,z3=3,z4=4,z5=5,z6=6,z7=7,z8=8,z9=9, \
        z10=10,z11=11,z12=12,z13=13,z14=14,z15=15;
    int i,j;
    getDValue();
    memcpy(&SortArray,&TempDValue,sizeof(TempDValue));//原有数据拷贝
    SelectionSort(TempDValue, CHANNELNUM);
    for(i = 0; i < CHANNELNUM; i++)
    {
        if(TempDValue[i] == SortArray[z0])//排序后与原值比较
        {
            ArrayLabel[j++]=z0;
            z0=16;//标志位更改不允许再次进入
        }
        else if(TempDValue[i] == SortArray[z1])
        {
            ArrayLabel[j++]=z1;
            z1=16;
        }
        else if(TempDValue[i] == SortArray[z2])
        {
            ArrayLabel[j++]=z2;
            z2=16;
        }
        else if(TempDValue[i] == SortArray[z3])
        {
            ArrayLabel[j++]=z3;
            z3=16;
        }
        else if(TempDValue[i] == SortArray[z4])
        {
            ArrayLabel[j++]=z4;
            z4=16;
        }
        else if(TempDValue[i] == SortArray[z5])
        {
            ArrayLabel[j++]=z5;
            z5=16;
        }
        else if(TempDValue[i] == SortArray[z6])
        {
            ArrayLabel[j++]=z6;
            z6=16;
        }
        else if(TempDValue[i] == SortArray[z7])
        {
            ArrayLabel[j++]=z7;
            z7=16;
        }
        else if(TempDValue[i] == SortArray[z8])
        {
            ArrayLabel[j++]=z8;
            z8=16;
        }
        else if(TempDValue[i] == SortArray[z9])
        {
            ArrayLabel[j++]=z9;
            z9=16;
        }
        else if(TempDValue[i] == SortArray[z10])
        {
            ArrayLabel[j++]=z10;
            z10=16;
        }
        else if(TempDValue[i] == SortArray[z11])
        {
            ArrayLabel[j++]=z11;
            z11=16;
        }
        else if(TempDValue[i] == SortArray[z12])
        {
            ArrayLabel[j++]=z12;
            z12=16;
        }
        else if(TempDValue[i] == SortArray[z13])
        {
            ArrayLabel[j++]=z13;
            z13=16;
        }
        else if(TempDValue[i] == SortArray[z14])
        {
            ArrayLabel[j++]=z14;
            z14=16;
        }
        else if(TempDValue[i] == SortArray[z15])
        {
            ArrayLabel[j++]=z15;
            z15=16;
        }        
    }   
}
#include <stdio.h>
#include <cstring>
void SelectionSort(int *arr, int *order, int n)
{
    for (int i = 0; i < n; i++)
    {
        order[i] = i;
    }
    for (int i = 0; i < n; i++)
    {
        int Minkey = arr[i];
        int order_num = order[i];
        for (int j = i; j < n; j++)
        {
            if (Minkey > arr[j])
            {
                int temp = arr[j];
                arr[j] = Minkey;
                Minkey = temp;

                int temp2 = order[j];
                order[j] = order_num;
                order_num = temp2;
            }
        }
        arr[i] = Minkey;

        order[i] = order_num;
    }
}

int main()
{
    int a[] = {1, 1, 1, 1, -3};
    int b[10];
    int order[10];
    int k = 0;
    int n = sizeof(a) / sizeof(int);
    memcpy(&b, &a, sizeof(a));
    SelectionSort(a, order, n);
    printf("The sorted array is:");
    printf("\n");
    for (int i = 0; i < n; i++)
    {
        printf(" %d", b[i]);
    }
    printf("\n");
    for (int i = 0; i < n; i++)
    {
        printf(" %d", a[i]);
    }
    printf("\n");
    for (int i = 0; i < n; i++)
    {
        printf(" %d", order[i]);
    }
    printf("\n");
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米杰的声音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值