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