在实现多个字符串进行排序之前我们先来了解下冒泡排序:
算法原理:
每次对相邻的两个元素进行比较,若前者大于后者,那么我们就交换,如此这样一趟下来的话,最大的元素就被放在了最后面,重复以上的步骤后,就可以对元素进行排序。
void swap(int *a, int *b){
int tmp = 0;
tmp = *a;
*a = *b;
*b = tmp;
}
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 - 1 - i; j++){
if (arr[i]>arr[j + 1]){
swap(&arr[i], &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个,那么便可以把这三个字符串看成是个二维数组,如此一个指向一维数组的指针就可以访问该数组,然后在根据冒泡排序的原理便可对其排序。
算法实现:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void bubble_sort_str(char *str[], int sz)
{
int i = 0;
int j = 0;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz - 1 - i; j++)
{
if (strcmp(*(str + j), *(str + j + 1))>0)
{
char *tmp = *(str + j);
*(str + j) = *(str + j + 1);
*(str + j + 1) = tmp;
}
}
}
}
int main()
{
int i = 0;
char *str[] = { "cccc", "bbbb", "dddd", "aaaa" };
bubble_sort_str(str, sizeof(str) / sizeof(*str));
for (i = 0; i < sizeof(str) / sizeof(*str); i++)
{
printf("%s ", *(str + i));
}
printf("\n");
system("pause");
return 0;
}
与上面的这种方法稍微不同的一种方法:
#include<stdio.h>
void bubble_sort_str(char *str[], int sz)
{
int i = 0;
int j = 0;
int flag;
for (i = 0; i < sz - 1; i++)
{
flag = 0;
for (j = 0; j < sz - i - 1; j++)
{
if (strcmp(*(str + j), *(str + j + 1))>0)
{
flag = 1;
char *tmp = *(str + j);
*(str + j) = *(str + j + 1);
*(str + j + 1) = tmp;
}
}
if (flag == 0)
{
return 0;
}
}
return 0;
}
int main()
{
char *str[] = { "aaaa", "cccc", "ffff", "dddd" };
bubble_sort_str(str, sizeof(str) / sizeof(str[0]));
int i = 0;
for (i = 0; i < sizeof(str) / sizeof(*str); i++)
{
printf("%s ", str[i]);
}
printf("\n");
system("pause");
return 0;
}