【冒泡排序】

冒泡排序:

所谓冒泡排序法,就是对一组数字进行从大到小或者从小到大排序的一种算法。具体方法是,相邻数值两两交换。从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不同,则将两个数的位置进行交换(对调);如果其与我们的期望一致,则不用交换。重复这样的过程,一直到最后没有数值需要交换,则排序完成。一般地,如果有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;
                    }
               }
          }
     }
}

结果:

冒泡排序_冒泡排序_03

所以是可以的,那么有没有一种函数,既可以排序字符串,又可以排序整数,还可以······


有,--------回调函数可以做到qsort()