用C语言编写函数,要实现快速排序算法或者冒泡法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言编写函数,要实现快速排序算法或者冒泡法相关的知识,希望对你有一定的参考价值。
冒泡法排序函数如下:void bubble(int a[],int n)
int i,j,t;
for(i=0;i<n-1;i++)/*共进行n-1轮*/
for(j=0;j<n-1-i;j++)/*每轮在前n-i个数中比较*/
if(a[j]>a[j+1]) /*若相邻元素逆序*/
t=a[j]; a[j]=a[j+1];a[j+1]=t;/*就交换*/
void sort(int *a, int left, int right)
if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
return ;
int i = left;
int j = right;
int key = a[left];
while(i < j) /*控制在当组内寻找一遍*/
while(i < j && key <= a[j])
/*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/
j--;/*向前寻找*/
a[i] = a[j];
/*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
a[left],那么就是给key)*/
while(i < j && key >= a[i])
/*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
i++;
a[j] = a[i];
a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
/*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
参考技术A 快排:
#include <stdio.h>
int qsort(int* a,int low,int high)
int temp = a[low];
while(low<high)
while(low < high && temp < a[high])
--high;
a[low] = a[high];
while(low < high && temp > a[low])
++low;
a[high] = a[low];
a[low] = temp;
return low;
void sort(int* a,int low,int high)
int temp;
if(low<high)
temp = qsort(a,low,high);
qsort(a,low,temp-1);
qsort(a,temp+1,high);
int main()
int list[] = 4,5,6,3,7,1;
sort(list,0,5);
char i;
for(i=0;i<6;i++)
printf("%3d",list[i]);
printf("\n");
return 0;
冒泡:
void sort(int *a,int len)//参数1,表示数组,参数2表示数组长度
int i,j,t;
for(i=0;i<len-1;i++)
for(j=0;j<len-1-i;j++)
if(a[j]<a[j+1])
t = a[j];
a[j] = a [j+1];
a[j+1] = t;
都是自己平时写的,全部可以调试通过,快排要是看不懂加我Q,285296372~本回答被提问者采纳 参考技术B 冒泡很简单,两个for循环嵌套就行了
void bubble(vector<int> &put)// put容器内放入要排序的数据即可
int temp;
temp=put[0];
for(int i=1;i!=put.size();i++)
for(int j=0;j<i;j++)
if(put[j]>put[i])
temp=put[i];
put[i]=put[j];
put[j]=temp;
C语言——如何有效记忆冒泡排序法?
冒泡排序法在C语言课程中是一个很重要的算法。要熟练掌握冒泡排序法,首先要有深刻的理解,同时也要准确地记住这个算法对应的代码,这样才能快速、准确地运用冒泡排序法写代码解决问题。那怎样有效地记忆住冒泡排序法对应的代码呢?下面跟大家分享一下我总结的口诀。
原创不易,欢迎点赞分享。
首先要对循环次数有深刻的理解,下面是几种情况:
1、for(i=0 ; i<k ; i++)
循环了 k 次,因为最后一次循环对应的 i 值为 k-1,而 0~k-1 有 k 个数,一个数对应一次循环,所以循环了 k 次。
2、for(i=0 ; i<=k ; i++)
循环了 k+1 次,因为最后一次循环对应的 i 值为 k,而 0~k 有 k+1 个数,一个数对应一次循环,所以循环了 k+1 次。
3、、for(i=1 ; i<k ; i++)
循环了 k-1 次,因为最后一次循环对应的 i 值为 k-1,而 1~k-1 有 k-1 个数,一个数对应一次循环,所以循环了 k-1 次。
4、for(i=1 ; i<=k ; i++)
循环了 k 次,因为最后一次循环对应的 i 值为 k,而 1~k 有 k 个数,一个数对应一次循环,所以循环了 k 次。
口诀:
两重循环,//有两个for 循环
两个变量,//有两个循环控制变量 i,j;其中j 既是循环控制变量,又
一重循环 NUM-1 次,//NUM 为数组的元素数目。
二重循环 ( NUM-第几次一重循环 ) 次,
//说明:为什么不说 NUM-i 次呢?因为 i 的初始值为1时才是 NUM-i 次,i 的初始值为0 时就是 NUM-i-1 次了。
一重循环体放二重循环,
二重循环体放大小比较与交换。
交换内容要看 j 初值。
//说明:j 的 初值为 1时 应交换 a[j-1] 与 a[j] , j 的 值为0时交换 a[j] 与 a[j+1].总之要从第一个数 a[0] 开始比较、交换。
所以冒泡排序法有以下 2*2=4 种写法。各种写法的区别是 i 和 j的初值不同。
写法一:(i=0 , j=0)
int main()
{
int a[NUM]={2,8,46,92,37,28,56,1,65,93};
int i,j,k;
int temp;
for(i=0;i<NUM-1;i++)
{
for(j=0;j<NUM-(i+1);j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(k=0;k<NUM;k++)
{
printf("第 %d 个数:%d \n",k+1,a[k]);
}
}
写法二:(i=1 , j=0)
int main()
{
int a[NUM]={2,8,46,92,37,28,56,1,65,93};
int i,j,k;
int temp;
for(i=1;i<=NUM-1;i++)
{
for(j=0;j<NUM-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(k=0;k<NUM;k++)
{
printf("第 %d 个数:%d \n",k+1,a[k]);
}
}
写法三:(i=0 , j=1)
int main()
{
int a[NUM]={2,8,46,92,37,28,56,1,65,93};
int i,j,k;
int temp;
for(i=0;i<NUM-1;i++)
{
for(j=1;j<=NUM-(i+1);j++)
{
if(a[j-1]>a[j])
{
temp=a[j-1]; //注意此时这里也变了。
a[j-1]=a[j];
a[j]=temp;
}
}
}
for(k=0;k<NUM;k++)
{
printf("第 %d 个数:%d \n",k+1,a[k]);
}
}
写法四:(i=1 , j=1)
int main()
{
int a[NUM]={2,8,46,92,37,28,56,1,65,93};
int i,j,k;
int temp;
for(i=1;i<=NUM-1;i++)
{
for(j=1;j<=NUM-i;j++)
{
if(a[j-1]>a[j])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
for(k=0;k<NUM;k++)
{
printf("第 %d 个数:%d \n",k+1,a[k]);
}
}
以上是关于用C语言编写函数,要实现快速排序算法或者冒泡法的主要内容,如果未能解决你的问题,请参考以下文章