ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

整理一下关于冒泡排序的相关实现操作

2022-04-07 20:31:54  阅读:139  来源: 互联网

标签:sz arr int void 冒泡排序 char 整理 操作 sizeof


1.普通整型数组冒泡排序

核心思想就是需要确定总共需要多少趟(次)冒泡,以及每趟需要比较的对数。

为了避免一开始数组已经排好序,而我们还再进行比较,可以在每趟对数比较之前设计一个标记量flag,如果一趟过后,flag的值未改变,就说明已经排好序了,此时结束循环

#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
    int i = 0;
    //n个元素比较n-1趟;
    for (i = 0; i < sz - 1; i++)
    {
        int flag = 1;
        //用来标记该组是否有序。
        int j;
        for (j = 0; j < sz - 1 - i; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int temp;
                temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
                flag = 0;
            }
        }
        if (flag == 1)
        {
            break;
        }
    }
}
int main()
{
    int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
    int i=0; 
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz);
    for(i=0;i<sz;i++)
    {
        printf("%d ",i);
    }
    return 0;
}
普通整形数组冒泡排序

 

2.库函数qsort实现整型数组冒泡排序

需要注意的是qsort有四个参数,第一个是数组名,第二个是数组元素的个数,第三个是每个元素的大小(字节),第四个函数。

#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1,const void* e2)
{
    return *(int*)e1-*(int*)e2; //强制转换成int* 型
}
int main()
{
    int arr[]={9,8,7,6,5,4,3,2,1};
    int sz=sizeof(arr)/sizeof(arr[0]);
    qsort(arr,sz,sizeof(arr[0]),cmp_int);//注意qsort的四个参数
    int i=0;
    for(i=0;i<sz;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}
View Code

 

3.库函数qsort实现浮点型数组冒泡排序

需要注意强制类型转换的地方

#include<stdio.h>
#include<stdlib.h>
int cmp_float(const void* e1,const void* e2)
{
    return (int)(*(float*)e1-*(float*)e2);
}
int main()
{
    float arr[]={9.0,8.0,7.0,6.0,5.0,4.0};
    int sz=sizeof(arr)/sizeof(arr[0]);
    qsort(arr,sz,sizeof(arr[0]),cmp_float);
        int i=0;
    for(i=0;i<sz;i++)
    {
        printf("%f ",arr[i]);
    }
    return 0;
} 
库函数qsort实现浮点型数组冒泡排序

 

4.库函数qsort实现字符排序

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp_char(const void* e1,const void* e2)
{
    
    return *(char*)e1-*(char*)e2;//字符-字符返回的也是整数,所以不用转换成int
}
int main()
{
    char arr[]={'f','e','d','c','b','a'};
    int sz=sizeof(arr)/sizeof(arr[0]);
    qsort(arr,sz,sizeof(arr[0]),cmp_char);
    int i=0;
    for(i=0;i<sz;i++)
    {
        printf("%c ",arr[i]);
    }
    return 0;
} 
View Code

 

5.库函数qsort实现结构体变量中的字符串排序

注意字符串之间的比较要用库函数strcmp,引用头文件

include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct stu{
    char name[20];
    int age;
};
int cmp_char(const void* e1,const void* e2)
{
    
    return strcmp(((struct stu*)e1)->name,((struct stu*)e2)->name);//字符串之间的比较要使用strcmp
}
int main()
{
    struct stu s[2]={{"zhang san",20},{"li si",18}};
    int sz=sizeof(s)/sizeof(s[0]);
    qsort(s,sz,sizeof(s[0]),cmp_char);
    int i=0;
    for(i=0;i<sz;i++)
    {
        printf("%s ",s[i].name);
    }
    return 0;
} 
View Code

 

6.自己实现qsort库函数功能对整形数组进行排序

#include<stdio.h>
#include<stdlib.h>
//整型冒泡排序
void swap(char* buf1, char* buf2, int width)
{
    int i = 0;
    for (i = 0; i < width; i++)
    {
        char temp = *buf1;
        *buf1 = *buf2;
        *buf2 = temp;
        buf1++;
        buf2++;
    }
}


//进行排序
int cmp_int(const void* e1, const void* e2)
{
    return  *(int*)e1 - *(int*)e2; //默认都是升序排列,倒叙可以交换减数和被减数
}

void bubble_sort(void* base, int sz, int width, int(*cmp)(void* e1, void* e2))
{
    int i = 0;
    int j = 0;
    for (i = 0; i < sz - 1; i++)
    {
        for (j = 0; j < sz - 1 - i; j++)
        {
            if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
            {
                swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
            }
        }
    }
}


int main()
{
int arr[] = { 1,3,5,7,9,2,4,6,8,10 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", i);
    }

    return 0;
}
View Code

标签:sz,arr,int,void,冒泡排序,char,整理,操作,sizeof
来源: https://www.cnblogs.com/HY1516438233/p/16114101.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有