微网站建设目的,联合实验室 网站建设方案,宁波seo管理,网站设计的规范你是真的“C”——为冒泡排序升级赋能#xff01;#x1f60e;前言#x1f64c;冒泡排序升级赋能之境界一#xff01;冒泡排序升级赋能之境界二#xff01;qsort库函数的运用和认识总结撒花#x1f49e;#x1f60e;博客昵称#xff1a;博客小梦 #x1f60a;最喜欢的…
你是真的“C”——为冒泡排序升级赋能前言冒泡排序升级赋能之境界一冒泡排序升级赋能之境界二qsort库函数的运用和认识总结撒花博客昵称博客小梦 最喜欢的座右铭全神贯注的上吧 作者简介一名热爱C/C算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主 博主小留言哈喽各位CSDN的uu们我是你的博客好友小梦希望我的文章可以给您带来一定的帮助话不多说文章推上欢迎大家在评论区唠嗑指正觉得好的话别忘了一键三连哦 前言 哈喽各位友友们我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下我仅已此文和大家分享你是真的“C”——为冒泡排序升级赋能 都是精华内容可不要错过哟 冒泡排序升级赋能之境界一
设计思路分析 首先分析经典的冒泡排序存在什么问题然后寻找有没有改良的方法。其实这也是以后作为程序员需要锻炼和掌握的一种能力这样我们才能不断的成长。 如果数组本来就是有序的那还需一趟一趟的继续遍历下去吗显然是没有必要的因此我么可以想到运用一个一个标记变量 flag 来记录控制。如果一趟遍历之后该变量值不变那么就可以判断出该数组有序的。就不必进行下一趟的遍历排序了。这样就能够提升一下冒泡排序的算法效率 具体的实现代码
#includestdio.h
#includestring.hvoid my_BubbleQsort(int* a, int len)
{int i 0;int flag 0;for (i 0; i len - 1; i){int j 0;for (j 0; j len - 1 - i; j){if (a[j] a[j 1]){int tmp a[j];a[j] a[j 1];a[j 1] tmp;flag 1;}}if (flag 0){break;}}}int main()
{int a[] { 2,3,1,4,9,0,10,11,33,22,55,44 };int len sizeof(a) / sizeof(a[0]);for (int i 0; i len; i){printf(%d , a[i]);}printf(\n);my_BubbleQsort(a, len);for (int i 0; i len; i){printf(%d , a[i]);}return 0;
}测试结果图
冒泡排序升级赋能之境界二
设计思路分析 我们知道有一个库函数叫做qsort我们可以直接利用它来进行一组数据的排序而且它的功能十分的强大对于任何数据类型都可以进行一个排序在这里我想模拟qsort库函数的万能属性将冒泡排序也赋予qsort的万能属性是不是非常酷 qsort库函数的运用和认识
要想让冒泡排序赋值万能属性我们需要先认识一下qsort是如何实现排序任意类型的数据的 。我们可以看到库里面的qsort接口长这样的 它的返回类型是 void 参数是括号里面的四个东西分别指的是起始地址数组首元素地址数据的个数一个数据的大小单位字节还有一个比较函数compare的函数指针。我们只需要设计出比较函数就行然后qsort内部会自动调用该函数然后将一个无需的数组进行排序。那有人会问这个compare函数要怎么实现呢其实qsort内部已有规定 规定如图所示 如果第一个元素大于第二个元素那么就返回 0 的数字如果第一个元素小于第二个元素那么就返回 0 的数字;如果第一个元素 等于 第二个元素那么就返回 0。 qsort库函数的运用实例代码
#includestdio.h
#includestring.h
#includestdlib.hint Compare(const void* e1, const void* e2)
{return *((int*)e1) - *((int*)e2);
}
int main()
{int a[] { 2,3,1,4,9,0,10,11,33,22,55,44 };int len sizeof(a) / sizeof(a[0]);for (int i 0; i len; i){printf(%d , a[i]);}printf(\n);qsort(a, len, sizeof(int), Compare);for (int i 0; i len; i){printf(%d , a[i]);}return 0;
}
测试结果图 qsort版冒泡排序具体的实现代码
void Swap( char* p1, char* p2, int width)
{for (int i 0; i width; i){char tem *(p1 i);*(p1 i) *(p2 i);*(p2 i) tem;p1;p2;}
}void my_BubbleQsort(void* base, size_t num, size_t width, int(*compare)(const void* e1, const void* e2))
{int i 0;for (int i 0; i num - 1; i){for (int j 0; j num - 1 - i; j){//升序 - 前一个大于后面一个就交换if (Compare((char*)base j * width, (char*)base (j1) * width) 0){Swap((char*)base j * width, (char*)base (j1) * width,width);}}}
}int Compare(const void* e1, const void* e2)
{return *((int*)e1) - *((int*)e2);
}
int main()
{int a[] { 2,3,1,4,9,0,10,11,33,22,55,44 };int len sizeof(a) / sizeof(a[0]);for (int i 0; i len; i){printf(%d , a[i]);}printf(\n);my_BubbleQsort(a, len, sizeof(int), Compare);for (int i 0; i len; i){printf(%d , a[i]);}return 0;
}
测试结果图
总结撒花 本篇文章旨在分享冒泡排序的改良。希望大家通过阅读此文有所收获如果我写的有什么不好之处请在文章下方给出你宝贵的意见。如果觉得我写的好的话请点个赞赞和关注哦~