选择法排序
#include<stdio.h>
int main()
{
int j, i;//定义两个整型控制内外两层循环
int a[10];//声明一个整型数组
int temp;//设置元素最小值
int pos;//记录当前元素的位置
//为数组元素赋值
printf("请输入数组的元素:\n");
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);//输入元素
}
for (i = 0; i < 9; i++)//设置外层循环的下标为0-8
{
temp = a[i];//设置当前元素为最小值
pos = i;//记录元素的位置
for (j = i + 1; j < 10; j++)//内层循环i+1~9
{
if (a[j] < temp)//如当前元素比最小值大
{
temp = a[j];//重新设置最小值
pos = j;//记录元素的位置
}
}
//交换两个元素
a[pos] = a[i];
a[i] = temp;
}
//循环输出数组中的元素并在第五个元素以后进行换行
for (i = 0; i < 10; i++)
{
printf("%d\t", a[i]);
if (i == 4)
printf("\n");
}
return 0;
}
冒泡法排序
#include<stdio.h>
int main()
{
int j, i;
int a[10];//99 11 15 16 51 56 85 65 25 52
int temp;
printf("请输入数组的元素:\n");
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
for (i = 1; i < 10; i++)//外层循环的下标为1~9
{
for (j = 9; j >= i; j--)//内层循环的下标为i~9
{
if (a[j] < a[j - 1])//如果前一个数比后一个数大
{
//交换两个数组元素的值
temp = a[j - 1];
a[j - 1] = a[j];
a[j] = temp;
}
}
}
for (i = 0; i < 10; i++)
{
printf("%d\t", a[j]);
if (i == 4)
printf("\n");
}
return 0;
}
交换法排序
#include<stdio.h>
int main()
{
int j, i;
int a[10];
int temp;
printf("请输入数组的元素:\n");
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
for (i = 0; i < 9; i++)//外层循环的下标为0~8
{
for (j =i+1; j <10; j++)//内层循环的下标为i+1~9
{
if (a[j] >a[i])//如果当前值比其他值小
{
//交换两个数组元素
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for (i = 0; i < 10; i++)
{
printf("%d\t", a[i]);
if (i == 4)
printf("\n");
}
return 0;
}
插入法排序
#include<stdio.h>
int main()
{
int i;
int a[10];//声明一个整型数组
int temp;//中间变量
int pos;
printf("请输入数组的元素:\n");
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
for (i = 1; i < 10; i++)
{
temp = a[i];记录前一个数数组的下标位置
pos = i - 1;//记录前一个数组元素的下标位置
while ((pos >=0) && (temp <a[pos]))
{
a[pos + 1] = a[pos];//插入到相应的位置
pos--;//每次插入一个值进行比较
}
a[pos + 1] = temp;
}
for (i = 0; i < 10; i++)
{
printf("%d\t", a[i]);//输出制表位
if (i == 4)
printf("\n");//如果是第五个元素就输出换行
}
return 0;
}
折半法排序
#include<stdio.h>
void CelerityRun(int left, int right, int a[]);//定义函数
int main()
{
int i;
int a[10];
printf("请输入数组的元素:\n");//打印要排序的数据
for (i = 0; i < 10; i++)
{
scanf_s("%d", &a[i]);//输入数据
}
for (i = 0; i < 10; i++)//循环输出数组中的元素,在第五行进行换行
{
printf("%d\t", a[i]);
if (i == 4)
printf("\n");
}
printf("\n");
return 0;
}
void CelerityRun(int left, int right, int a[])
{
int i, j;//定义两个整型
int middle, temp;//定义中间值和临时变量
i = left;//j表示左侧下标
j = right;//j表示右侧下标
middle = a[left + right] / 2;//中间值的下标的位置
do
{
//左侧的值小于中间值就取下一个值与中间值比较
while ((a[i] < middle) && (i < right))
i++;
//右侧的值大于中间值就取下一个元素与中间值比较
while ((a[j] > middle) && (j > left))
j--;
if (i < j)//判断i是否小于j,小于就交换
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
} while (i < j);
//if (left < j)
// //递归左半边
// CelerityRun(left, j, a);
//if (right > i)
// //递归右半边
// CelerityRun(i, right, a);
}
排升序
给一组数据:99 、11、 15 、16、51、 56 、85 、65、 25、 52 ,数组里面有十个元素,将它们排成升序后的样子是:
总结
插入法、冒泡法、交换法排序的速度较慢,但是参加排序的序列局部或整体有序时,这三种排序能达到较快的速度;在这种情况下,折半法排序反而显得速度满了,因为折半法排序是对于元素的个数(n)较大时,是速度最快的排序算法;但当(n)很小时,此方法比其他排序还要慢,当要排序的元素数量(n)较小时,对稳定性也不做要求,我们用选择法排序,对稳定性有要求我们用插入法或冒泡法比较好!