【C语言】冒泡排序、选择排序、插入排序(以升序为例)

一. 冒泡排序(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++)//n内循环进行两两比较
		{
    
    
			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++)//n内循环进行两两比较
		{
    
    
			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循环是用来输出数据的。

猜你喜欢

转载自blog.csdn.net/m0_74102736/article/details/130036316