一、将一个整形数组排序:
数组在传参时应该注意:
我们也可以使用指针的方法来进行实现:
定义两个指针:头指针和尾指针
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void bubble_sort(int a[], int size)
{
assert(a);
int *start = a; //定义头指针
int *end = a + size - 1;//定义尾指针
while (end > a){ //至少是在第二个,所以要大于第一个
int flag = 0; //定义标志位
for (start = a; start < end; start++)
{
if (*start>*(start + 1))
{
flag = 1;
*start ^= *(start + 1);
*(start + 1) ^= *start;
*start ^= *(start + 1);
}
}
if (flag == 0) //若标志位不变则说明本身就为有序的
{
break;
}
end--; // 进行了一次冒泡,已经将最大的值放在最右侧,将尾指针减1,下一次冒泡则不用再冒这个
}
}
int main()
{
int a[] = { 12, 2, 23, 45, 6, 78, 4, 6, 10 };
int size = sizeof(a) / sizeof(a[0]);
bubble_sort(a, size);
system("pause");
return 0;
}
二、写冒泡排序可以排序多个字符串。
在内部循环(j<size-1-i):在这里-i是因为经历一次外部循环方可找出排序出一个最大的字符串,那么在下一次,就不用再让它进行比较
#include<stdio.h>
#include<stdlib.h>
void string_sort(char *str[],int size)
{
int i = 0;
for (i = 0; i < size - 1; i++) //控制外部循环次数
{
int flag = 0; //设标志位位
int j = 0;
for (j = 0; j < size - 1 - i; 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) //若标志位不变,则说明已经为有序
break;
}
}
int main()
{
char *str[] = { "hskd", "abcd", "weqo" };
int size = sizeof(str) / sizeof(str[0]); //计算字符串长度
string_sort(str, size);
int i= 0;
for (i = 0; i < size; i++)
{
printf("%s\n", *(str+i)); //打印字符串
}
system("pause");
return 0;
}