目录
冒泡排序
void bubblesort(int n,char a[])//通过移动数组元素排序
//无脑写法:内外循环均为n-1次
{
for (int i = 0; i < n-1; i++)//总共进行n-1轮外循环
{
for (int j = n-1 ; j > i; j--)//n-i-1次内循环使最小数移动到数组前部
{
if (a[j - 1] > a[j])
{
int tmp = a[j];
a[j] = a[j - 1];
a[j - 1] = tmp;
}
}
}
}
void bubblesort1(int n, char a[])//优化写法:使用flag,若已经有序,则不再外循环
{
for (int i = 0; i < n - 1; i++)//最多进行n-1轮外循环
{
int flag = 1;
for (int j = n - 1; j > i; j--)//n-i-1次内循环使最小数移动到数组前部
{
if (a[j - 1] > a[j])
{
flag = 0;
int tmp = a[j];
a[j] = a[j - 1];
a[j - 1] = tmp;
}
}
if (flag)
break;
}
}
void bubblesort2(int n, char a[])//另一种写法
{
int flag;
do
{
flag = 0;
for (int i = 1; i < n ; i++)//如果前移最小数,则起止均用变量表示,需另设变量保存n初值
{
if (a[i - 1] > a[i])
{
flag=1;
int tmp = a[i];
a[i] = a[i - 1];
a[i - 1] = tmp;
}
}
n--;
} while (flag);
}
选择排序
void selectionsort(int n,char a[])//通过交换数组元素排序
{
for (int i = 0; i < n-1; i++)
{
int min = i, tmp;
for (int j = i+1; j < n; j++)//n-i-1次内循环找出最小数下标
{
if (a[j] < a[min])
min = j;
}
tmp = a[i];
a[i] = a[min];
a[min] = tmp;
}
}
快速排序
void quicksort(int s,int t,char a[])//s:序列第一位下标;t:序列末位下标
{
if (s < t)
{
int key = a[s], i = s, j = t;
while (i < j)//循环内部也需时刻保证i<j
{
while (i < j && a[j] >= key)
j--;
a[i] = a[j];
while (i < j && a[i] <= key)
i++;
a[j] = a[i];
}
a[i] = key;//分为key前后两个子序列
quicksort(s, i - 1, a);
quicksort(i + 1, t, a);
}
}
测试用主函数
void main()
{
int n;
char a[50];
scanf_s("%d%s", &n,a,50);
//bubblesort(n, a);
//bubblesort1(n, a);
//bubblesort2(n, a);
//selectionsort(n, a);
//quicksort(0, n - 1, a);
puts(a);
}