#include <stdio.h>
#define N 10
/*冒泡排序
(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;
然后比较第二个数与第三个数;依次类推,
直至第n-1个数和第n个数比较为止——第一趟冒泡排序,
结果最大的数被安置在最后一个元素位置上
(2)对前n-1个数进行第二趟冒泡排序,
结果使次大的数被安置在第n-1个元素位置
(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束
*/
int main()
{
int a[N] = {2,5,8,6,3,4,9,7,0,1};
int i, j, tmp;
for (i = 0; i < N-1; i++)//控制轮数,每轮都是从a[0]开始往后比较
{
for (j = 0; j < N-i-1; j++)//每轮比较次数,选择完后剩下的个数
{
if (a[j] > a[j + 1])//第一个数和第二个数比,第二个数和第三个数比
//大的数往后放
{
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
for (i = 0; i < N; i++)
{
printf ("%d\n", a[i]);
}
return 0;
}
/*鸡尾酒排序:将一组树先从左往右两两比较,将较大的数放到后面,最后当前数组中最大的数放在最后(前面数比后面数大则交换两者的位置,其他情况则不变),右边界往左移一位(在数组中最开始右边界为最大下标位置,即最大下标left-1),最大的数看做排除出数组;再从右边界开始(left-1)开始往左找,两两比较,将教小的数放到前面(前面数比后面数大则交换两者的位置,其他情况则不变),最后当前最小的数放在最前面,左边界往右移一位(最开始左边界在0位置,right+1),最小的数看成排除出数组*/
int main()
{
int a[10] = {9,6,8,0,3,5,2,4,7,1};
int len = sizeof(a) / sizeof(a[0]);
int i;
int left = 0;
int right = len - 1;
while (left < right)
{
// 从左往右找到一个最大的数放到right的位置
for (i = left; i < right; i++)
{
if (a[i] > a[i+1])
{
swap (a, i, i+1);
}
}
right--;
// 从右往左找到一个最小的数放到left的位置
for (i = right; i > left; i--)
{
if (a[i-1] > a[i])
{
swap (a, i, i-1);
}
}
left++;
}
printA (a, len);
return 0;
}
/*选择排序(1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换—第一趟选择排序, 结果最小的数被安置在第一个元素位置上(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录, 将它与第二个数交换—第二趟选择排序(3)重复上述过程,共经过n-1趟排序后,排序结束*//*与冒泡排序共享头文件与宏定义,但一个程序里只能有一个main函数,写一起的话,在main后写上数字(1,2,3,4)已做区分,不让系统预编译*/int
main(){int a[N] = {2,5,8,6,3,4,9,7,0,1};int i, j, tmp;for (i = 0; i < N - 1; i++)//控制循环轮数{int index = i;//设最小下标,i的值不能在子循环里改变for (j = i+1; j < N; j++){if (a[j] < a[index])//a[index]代表每轮首个元素{index = j;//找出每轮最小值的下标,让index也代表最小值下标}}if (index != i)//原先index代表每轮首个元素下标,{
//如果在一轮里找到其他最小值的下标,index值改变(同上个注释)tmp = a[i];a[i] = a[index];//a[index]就是每轮最小值,赋值给每轮的第一个元素a[index] = tmp;//}}for (i = 0; i < N; i++){printf ("%d\n", a[i]);}return 0;}