【冒泡排序】
冒泡排序:
所谓冒泡排序法,就是对一组数字进行从大到小或者从小到大排序的一种算法。具体方法是,相邻数值两两交换。从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不同,则将两个数的位置进行交换(对调);如果其与我们的期望一致,则不用交换。重复这样的过程,一直到最后没有数值需要交换,则排序完成。一般地,如果有N个数需要排序,则需要进行(N-1)趟起泡。下来写一个简单例子测试下:
要求:将×××数组中元素按照从小到大方式排序,如:arr[]={1,3,5,7,9,2,4,6,8,0};
#include <stdio.h>
void swap(int *n1,int *n2)
{
int tmp=*n1;
*n1=*n2;
*n2=tmp;
}
void bubble(int arr[],int n)
{
int i=0;
int j=0;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-i-1;j++)
{
if (arr[j]>arr[j+1])
{
swap(arr+j,arr+j+1);
}
}
}
}
int main()
{
int arr[]={1,3,5,7,9,2,4,6,8,0};
int len=sizeof(arr)/sizeof(arr[0]);
int i=0;
bubble(arr,len);
for(i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
结果:
下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为flag=1,否则为flag=0。明显如果有一趟没有发生交换,说明排序已经完成。再来看:
void bubble(int arr[],int n)
{
int i=0;
int j=0;
int flag;//设置标志位
flag=1;
while(flag)
{
flag=0;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-i-1;j++)
{
if (arr[j]>arr[j+1])
{
swap(arr+j,arr+j+1);
flag=1;
}
}
}
}
}
结果:
那么问题来了,冒泡排序可以排序字符串数组不?答案是可以滴!!
问题描述:有一字符串数组:char *arr[]={"abcd","aaaa","abbd","paul"}.
请按照从小到大顺序排序。
代码实现:
void bubble(char *arr[],int n)
{
int i=0;
int j=0;
int flag=0;
flag=1;
while (flag)
{
flag=0;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-i-1;j++)
{
if ((strcmp(arr[j],arr[j+1]))>0)
{
char *tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
flag=1;
}
}
}
}
}
结果:
所以是可以的,那么有没有一种函数,既可以排序字符串,又可以排序整数,还可以······
有,--------回调函数可以做到qsort()
转载于:https://blog.51cto.com/xujiafan/1721242