c语言的排序问题

本文详细介绍了选择排序、冒号排序和插入排序三种基础的排序算法,通过C语言代码示例展示了它们的工作原理和实现过程,包括升序和降序两种排序方式以及边界条件的处理。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

这里暂时只写一下三种排序,


一:选择排序

        选择排序的思想是:从第一数据元素起,将每一个数字与除他之外的数字比较,如果是升序(降序),则遇到比它小(大)的数字,则交换.

这样最小(大)的数字,会依次按数组下标依次排列。
上代码!:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void Arrange(int *arr,size_t sz) {
	//我的想法是,把数组中的数字,想象成两组相同的数字,
	//一组是比较的,一组是被比较的,这样更直观
	//我们需要考虑到边界问题,1  所有之前的数字已经排列好的情况下
	//最后一个数字便不需要比较了
	int tmp = 0;
	for (int i = 0; i < sz - 1; i++) {
		//2 首先比较的数字不需要和自己比较,
		//其次比较的数字不需要和自己下标小的比较因为在之前已经比较完毕
		//被比较的数字直至最大下标的数字
		for (int j = i + 1; j < sz; j++) {
			if (arr[i] > arr[j]) {//以升序举例,降序的话改成< 即可
				//交换两块空间的内容
				tmp = 0;
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
			}
		}
	}
	for (int i = 0; i < sz; i++) {
		printf("%d ", arr[i]);

	}
}

int main() {
	
	int arr1[10] = { 1,5,3,4,1,0,3,9,5,6 };
	//计算数组元素的个数
	size_t sz1 = sizeof(arr1)/sizeof(arr1[0]);
	printf("排列前:\n");
	for (int i = 0; i < 10; i++) {
		printf("%d ", arr1[i]);
	}
	printf("\n");
	printf("排序后:\n");
	Arrange(arr1,sz1);
	return 0;
}

在这里插入图片描述

二 : 冒号排序:

思想 : 相邻的两个数如果反序则互换,直至没有反序

实现:最小的下标的元素开始与相邻的数进行比较,则一轮过后,倒数第一位则成为最大(升序)或最小(降序)的数
如此循环反复,数轮之后,就可以实现我们的排列
代码如下:

#include<stdio.h>
int main() {
	int tmp = 0;
	int arr1[10] = { 1,6,4,9,3,2,5,7,2,8 };
	//数组元素个数
	int sz1 = sizeof(arr1) / sizeof(arr1[0]);
	printf("排序前:\n");
	for (int i = 0; i < sz1; i++) {

		printf("%d ", arr1[i]);

	}
	//注意边界问题,我们需要冒号比较多少轮?
	//由于最后的数字不需要再向右比较,故最多比较sz1 - 1轮
	for (int i = 1; i < sz1; i++) {
		//冒号排序的最大下标在逐渐减小,减小的频率与i增大的频率等同
		for (int j = 0; j < sz1-i; j++) {
			//冒号排序 升序举例
			if (arr1[j] > arr1[j + 1]) {
				tmp = 0;
				tmp = arr1[j];
				arr1[j] = arr1[j + 1];
				arr1[j + 1] = tmp;
			}

		}
	}
	printf("排序后:\n");
	for (int j = 0; j < sz1; j++) {

		printf("%d ", arr1[j]);


	}
	return 0;
}

三: 插入排序

思想是: 从第一个元素起,将其视为一个有序数列,对于反序的数字,则插入到有序数列中,转化为
有序数列的一部分!

#include<stdio.h>
void Print(int* arr, size_t sz) {
	for (int i = 0; i < sz; i++) {

		printf("%d ", arr[i]);



	}

 }

//插入排序的思想:
void  Insert_sort(int *arr,int sz) {
	printf("排序前:\n");
	Print(arr, sz);


	//从第一个元素开始排序,(以升序为例)
	//1 对所有的元素,进行操作
	for (int i = 0; i < sz; i++) {
		int j = 0;
	    int key = arr[i];
	    //比较本元素之前的所有数字,从下标小的元素开始比(大家也可以从序列的
	  //  最后一个元素往前比)
			while (j<i) {
				if (key > arr[j]) {}
					//如果比有序的元素小或者等于,需要空出一个位置,将比较的数字,插入序列中
					//实现:将此时被比较的数字到序列的最后一个数字,这一串数据整体往右移
					if (key <= arr[j]) {
						for (int l = i-1; l >=j; l--) {
							//整体元素往  → //大的先出去,小的才能进
							arr[l + 1] = arr[l];
						}
						// 空间空出之后,将比较的数字赋给空间;
						arr[j] = key;
					    //在比较执行完后,本元素就不需要再去其他的数字比较了
					    //,跳出循环,换下一元素!
						break;
					}
				j++;
			}
	}
	printf("排序后:\n");
	Print(arr, sz);

}
int main() {
	//插入排序
	int arr1[10] = { 1,3,2,5,4,9,8,6,7,6 };
	int sz1 = sizeof(arr1) / sizeof(arr1[0]);
	Insert_sort(arr1,sz1);
	return 0;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值