数组是一组有序数据的集合。
”有序“指的是数组元素在内存中的存放方式是有序的,其引用方式也有规律可循,而不是说数据元素在数组中是按照数值大小有序排列的。
1.选择法排序
每次在待排序数组中查找最大或最小的数组元素,将其值与最前面没有进行过排序的数组元素的值进行互换。由大到小排序应查找最大值,由小到大排序应查找最小值。
#include<stdio.h>
int main()
{
int i, j;
int a[10]; //定义数组,存储元素输入的10个数
int iTemp; //定义变量,表示最小的数组元素
int iPos; //定义变量,表示元素位置
printf("为数组元素赋值:\n");
for (i = 0; i < 10; i++)//输入十个数,为数组元素赋值
{
printf("a[%d]=", i);
scanf("%d", &a[i]);
}
/*使用选择法对数组元素从小到大排序*/
for (i = 0; i < 9; i++)//设置外层循环下表为0~8
{
iTemp = a[i];//假设当前为最小元素
iPos = i;//记录最小元素位置
for (j = i + 1; j < 10; j++)//设置内层循环下表为i+1~9,表示剩下的未排序数组元素
{
if (a[j] < iTemp)
{
iTemp = a[j];//重新设定最小值
iPos = j;//修正最小元素位置
}
}
a[iPos] = a[i];//互换元素
a[i] = iTemp;
}
printf("排序结果如下:\n");
for (i = 0; i < 10; i++)
{
printf("%d\t", a[i]);
if (i == 4)
printf("\n");
}
printf("\n");
return 0;
}
2.冒泡法排序
每次比较数组中相邻的两个数组元素的值,将较小的数排在较大的数前面,可实现数组元素从小到大排序;每次将较大的数排在较小的数前面,可实现数组元素从大到小排序。
#include<stdio.h>
int main()
{
int i, j;
int a[10]; //定义数组,存储元素输入的10个数
int iTemp; //定义变量,表示最小的数组元素
int iPos; //定义变量,表示元素位置
printf("为数组元素赋值:\n");
for (i = 0; i < 10; i++)//输入十个数,为数组元素赋值
{
printf("a[%d]=", i);
scanf("%d", &a[i]);
}
/*使用冒泡法对数组元素从小到大排序*/
for (i = 1; i < 10; i++)//设置外层循环下表为1~9,表示后九个元素
{
for (j = 9; j > i; j--)//设置内层循环下表为9~i,表示最后一个元素开始向前循环
{
if (a[j] < a[j-1])//如果前一个数比后一个数大
{
iTemp = a[j-1];
a[j-1] = a[j];
a[j] = iTemp;
}
}//交换两个数组元素的值,使小数前移,如同冒泡
}
printf("排序结果如下:\n");
for (i = 0; i < 10; i++)
{
printf("%d\t", a[i]);
if (i == 4)
printf("\n");
}
printf("\n");
return 0;
}
3.交换法排序
交换法排序是将每一位数于其后的所有数一一比较,如果发现符合条件的数据,则交换数据。
#include<stdio.h>
int main()
{
int i, j;
int a[10]; //定义数组,存储元素输入的10个数
int iTemp; //定义变量,表示最小的数组元素
int iPos; //定义变量,表示元素位置
printf("为数组元素赋值:\n");
for (i = 0; i < 10; i++)//输入十个数,为数组元素赋值
{
printf("a[%d]=", 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])//如果前一个数比后一个数大
{
iTemp = a[i];
a[i] = a[j];
a[j] = iTemp;
}
}//交换两个数组元素的值
}
printf("排序结果如下:\n");
for (i = 0; i < 10; i++)
{
printf("%d\t", a[i]);
if (i == 4)
printf("\n");
}
printf("\n");
return 0;
}
4.插入法排序
插入法排序较为复杂,其基本原理是:抽出一个数据,在前面的数据中寻找相应的位置插入,然后继续下一个数据,直接完成排序。
#include<stdio.h>
int main()
{
int i, j;
int a[10]; //定义数组,存储元素输入的10个数
int iTemp; //定义变量,表示最小的数组元素
int iPos; //定义变量,表示元素位置
printf("为数组元素赋值:\n");
for (i = 0; i < 10; i++)//输入十个数,为数组元素赋值
{
printf("a[%d]=", i);
scanf("%d", &a[i]);
}
/*使用插入法对数组元素从小到大排序*/
for (i = 1; i < 10; i++)//设置外层循环下表为1~9,表示前九个元素
{
iTemp = a[i];//设置插入值
iPos = i - 1;
while ((iPos >= 0) && (iTemp < a[iPos]))//内层循环,寻找插入的位置
{
a[iPos + 1] = a[iPos];//插入数值
iPos--;
}
a[iPos] = iTemp;
}
printf("排序结果如下:\n");
for (i = 0; i < 10; i++)
{
printf("%d\t", a[i]);
if (i == 4)
printf("\n");
}
printf("\n");
return 0;
}
5.折半法排序
折半法排序又称为快速排序,其基本原理为:选择一个中间值(在程序中使用数组中间元素的值,然后把中间值小的元素放在左边,比中间值大的元素放在右边(具体的实现是从两边查找,找到一对后进行交换),然后再对左右两边分别递归使用折半法排序过程。