一. 冒泡排序(Bubble sort)
1. 理解:
- 两个数两个数进行比较后判断是否进行交换,即第一个数和第二个数进行比较,第二个数和第三个数进行比较,依次类推,第一轮比较完后可以找出一个最大值并且排在整个数组的最后,然后进行第二轮、第三轮,与第一轮不同的是第一轮以后已经有排好序的数了,不必再排序。
2. 代码实现(以升序为例):
#include<stdio.h>
int main()
{
int a[100], i, j, n, temp;
printf("请输入需要进行排序的数据的个数:");
scanf("%d", &n);
for (i = 0; i<n; i++)
{
scanf("%d", &a[i]);
}
for(i=0;i<n-1;i++)
for (j = 0; j < n - i - 1; j++)
{
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
printf("按升序排列如下:\n");
for (i = 0; i <n; i++)
{
printf("%-2d",a[i]);
}
return 0;
}
3. 代码解释
- 第一个for循环用来输入数据,由于定义了数组容量,所以最多只能输入100个数据;第二个for循环是外循环,决定比较的起点,这里的n-1要特别注意怎么来的;第三个for循环是内循环,进行数之间的比较,这里的n-i-1要特别注意怎么来的;最后一个for循环是用来输出数据的。
二. 选择排序
1. 理解:
- 将第一个数与后面的数依次比较判断是否交换,第一轮比较完成后可以直接找出一个最小值并排在最前面,第二轮将第二个数与后面的数进行比较,依次类推。
2. 代码实现(以升序为例):
#include<stdio.h>
int main()
{
int a[100], i, j, n, temp;
printf("请输入需要进行排序的数据的个数:");
scanf("%d", &n);
for (i = 0; i<n; i++)
{
scanf("%d", &a[i]);
}
for(i=0;i<n-1;i++)
for (j = i+1; j < n; j++)
{
if (a[i] > a[j ])
{
temp = a[i];
a[i] = a[j];
a[j ] = temp;
}
}
printf("按升序排列如下:\n");
for (i = 0; i <n; i++)
{
printf("%-2d",a[i]);
}
return 0;
}
3. 代码解释
- 第一个for循环用来输入数据,由于定义了数组容量,所以最多只能输入100个数据;第二个for循环是外循环,决定比较的起点,这里的n-1要特别注意怎么来的;第三个for循环是内循环,进行数之间的比较,这里的i+1要特别注意怎么来的;最后一个for循环是用来输出数据的。
三. 插入排序
1. 理解:
- 将需要排序的数直接插入两个数之间,需要注意的是比第一个数小或比最后一个数大的时候。
2. 代码实现(以升序为例):
#include<stdio.h>
int main()
{
int arr[11] = {
0,1,2,4,5,6,9,10,11,12 }, i, j, m;
printf("请输入需要排序的一个数:");
scanf("%d", &m);
for (i = 0; i < 10; i++)
{
if (m < arr[0])
{
for (i = 10; i > 0; i--)
{
arr[i] = arr[i - 1];
}
arr[0] = m;
break;
}
if (m > arr[9])
arr[10] = m;
if (m >= arr[i] && m <= arr[i + 1])
{
for (j = 10; j > i + 1; j--)
{
arr[j] = arr[j - 1];
}
arr[i + 1] = m;
break;
}
}
for (i = 0; i < 11; i++)
{
printf("%d", arr[i]);
printf(" ");
}
return 0;
}
3. 代码解释
- 第一个for循环用来找出需排序的数需插入的位置,最后一个for循环是用来输出数据的。