在實現多個字符串的排序之前,先來回顧一下冒泡排序:
算法原理:
每次對相鄰的兩個元素進行比較,若前者大於後者則交換,如此一趟下來最後一個則是最大的一個元素;重複以上步驟,除了已經確定位置的元素。
算法實現:
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-1; 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; }