1.选择排序法
什么是选择排序呢?
通俗的来讲就是给定一个数组,将数组中第一个元素和最小的元素进行位置互换,依次进行直至没有比它大的数即可实现从小打到排序。
书本定义,选择排序法是指每次选择所要排序的数组中的最小值的数组元素,将这个数组元素的值与前面没有进行排序的数组元素的值互换。l
下面我们把数字 8,12 ,3,21,10,进行选择排序法:
元素【0】 | 元素【1】 | 元素【2】 | 元素【3】 | 元素【4】 | ||
初始值 | 8 | 12 | 3 | 21 | 10 | |
第1次排序 | 3 | 12 | 8 | 21 | 10 | |
第2次排序 | 3 | 8 | 12 | 21 | 10 | |
第3次排序 | 3 | 8 | 10 | 21 | 12 | |
第4次排序 | 3 | 8 | 10 | 12 | 21 | |
排序结果 | 3 | 8 | 10 | 12 | 21 |
通过表格发现第一次排序:是将第一个元素和最小元素的位置进行互换。
第二次排序:是将第二个元素和剩下元素中最小的元素的位置进行互换。
……依次进行
代码实现:
#include <stdio.h>
int main()
{
int i, j = 0;
int arr[5];
int temp = 0;
int count = 0;
printf("为数组元素赋值:\n");
//从键盘为数组元素赋值
for (i = 0; i < 5; i++)
{
printf("a[%d]=", i);
scanf("%d", &arr[i]);
}
//从小到大排序
for (i = 0; i < 4; i++)
{
temp = arr[i];
count = i;
for (j = i + 1; j < 5; j++) //判断是否第一个元素比后面的元素小
{
if (arr[j] < temp)
{
temp = arr[j];
count = j;
}
}
//交换两个元素值
arr[count] = arr[i];
arr[i] = temp;
}
for (i = 0; i < 5; i++)
{
printf("%d\t", arr[i]);
if (2 == i)
{
printf("\n");
}
}
return 0;
}
程序运行结果为:
2.冒泡排序
什么是冒泡排序呢?
通俗的讲,冒泡排序就是给定一个数组,将数组中的相邻元素依次相比较,较小的数前,较大的数后。
书本定义,冒泡排序指的是在排序时,每次比较数组中相邻的两个数组元素的值,将较小的数(从小到大)排在较大的书前面。
下面我们把数字 8,12 ,3,21,10,进行冒泡排序法
元素【0】 | 元素【1】 | 元素【2】 | 元素【3】 | 元素【4】 | ||
初始值 | 21 | 12 | 10 | 8 | 3 | |
第1趟排序 | 12 | 21 | 10 | 8 | 3 | |
第2趟排序 | 12 | 10 | 21 | 8 | 3 | |
第3趟排序 | 12 | 10 | 8 | 21 | 3 | |
第4趟排序 | 12 | 10 | 8 | 3 | 21 | |
排序结果 | 12 | 10 | 8 | 3 | 21 |
注:一次只可以确定一个元素的顺序。
元素【0】 | 元素【1】 | 元素【2】 | 元素【3】 | 元素【4】 | ||
初始值 | 21 | 12 | 10 | 8 | 3 | |
第1次排序 | 12 | 10 | 8 | 3 | 21 | |
第2次排序 | 10 | 8 | 3 | 12 | 21 | |
第3次排序 | 8 | 3 | 10 | 12 | 21 | |
第4次排序 | 3 | 8 | 10 | 12 | 21 | |
排序结果 | 3 | 8 | 10 | 12 | 21 |
代码1实现:
#include <stdio.h>
int main()
{
int i, j = 0;
int arr[5];
int temp = 0;
int count = 0;
printf("为数组元素赋值:\n");
//从键盘为数组元素赋值
for (i = 0; i < 5; i++)
{
printf("a[%d]=", i);
scanf("%d", &arr[i]);
}
//从小到大排序
for (i = 0; i < 5-1; i++)
{
for (j = 0; j < 5 - 1 - i;j++)
{
if (arr[j] >arr[j+1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j+1] = temp;
}
}
}
for (i = 0; i < 5; i++)
{
printf("%d\t", arr[i]);
if (2 == i)
{
printf("\n");
}
}
return 0;
}
代码2实现:
#include <stdio.h>
int main()
{
int i, j = 0;
int arr[5];
int temp = 0;
printf("为数组元素赋值:\n");
//从键盘为数组元素赋值
for (i = 0; i < 5; i++)
{
printf("a[%d]=", i);
scanf("%d", &arr[i]);
}
//从小到大排序
for (i = 1; i < 5 ; i++)
{
for (j = 4; j >= i;j--)
{
if (arr[j] <arr[j - 1]) //如果前一个数大于后一个数
{
//交换两个数组元素的值
temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
}
}
}
for (i = 0; i < 5; i++)
{
printf("%d\t", arr[i]);
if (2 == i)
{
printf("\n");
}
}
return 0;
}
程序运行结果为: