在实现多个字符串的排序之前,先来回顾一下冒泡排序:
算法原理:
每次对相邻的两个元素进行比较,若前者大于后者则交换,如此一趟下来最后一个则是最大的一个元素;重复以上步骤,除了已经确定位置的元素。
算法实现:
void swap(int *a, int *b) { int temp = 0; temp = *a; *a = *b; *b = temp; } void bubble_sort(int arr[],int length) { int i = 0; int j = 0; for (i = 0; i < length-1; i++) { for (j = 0; j < length - i-1; j++) { if (arr[j]>arr[j + 1]) swap(&arr[j], &arr[j + 1]); } } }
算法优化:
void swap(int *a, int *b) { int temp = 0; temp = *a; *a = *b; *b = temp; } void bubble_sort2(int *arr, int length) { int i = 0; int j = 0; int flag = 1; for (i = 0; i < length - 1; i++) { flag = 0;//每次先重置为0 for (j = 0; j < length - 1 - i; j++) { if (arr[j]>arr[j + 1]) { swap(&arr[j], &arr[j + 1]); flag = 1; } } if (!flag) break; } }
优化原理:
如上面的代码,里面的一层循环在某次扫描中若没有交换则说明此时数组已经全部有序,无需再扫描了。因此,可以增加一个标记,每交换一次就进行标记,如果某次循环完没有标记,则说明已经完成排序了。
现在来说说如何用冒泡排序对多个符串进行排序:
算法原理:假设对3个字符串进行排序,每个字符串的字符数不超过10个,那么便可以把这三个字符串看成是个二维数组,如此一个指向一维数组的指针就可以访问该数组,然后在根据冒泡排序的原理便可对其排序。
算法实现:
void arr_bubble_sort(char(*p)[10])//数组指针,即指向大小为10的数组的指针 { int i = 0; int j = 0; char temp[10] ; char *t = temp; for (i = 0; i < 3; i++) { for (j = 0; j < 3 - i; j++) { if (strcmp(p[j], p[j + 1])>0) { strcpy(t, p[j]); strcpy(p[j], p[j + 1]); strcpy(p[j + 1], t); } } } } int main() { char a[3][10] = { "aacd", "aaer", "aaiu" }; char i = 0; char (*p)[10] = { 0 }; p = a;//p指向a的第0行 arr_bubble_sort(p); for (i = 0; i < 3; i++) { printf("%s\n", a[i]);//按行输出 } system("pause"); return 0; }
原文:http://seann.blog.51cto.com/11126490/1736648