5.C_Demo_排序

冒泡排序法

原理:

依次比较相邻的两个元素,如果顺序错误就交换。

思路:

这种方法,显然需要很多轮才能完成,每一轮只能排序一个最大值或最小值(第一层for),将全部的数据排序完成,需要很多轮(第二层for)。

对于第一层for,就是遍历数组,然后比较大小,进行交换。有两个注意点:

  • 效率:第一次排序完成之后,末尾就已经是最值了,下一次可以不再比较末尾这个数字。
  • 越界:比如数组大小为5,要比较的实际是ai与ai+1,因此i+1要小于5,不能越界

对于第二层for,就是考虑需要比较多少次。有两个注意点:

  • 次数:有5个数,找出4个最值就可以进行排序了,而不是需要找5次。
  • 效率:当第一层for没有进行排序时,代表这个数组已经排序好了,这时可以直接break。

代码接口说明如下:

1、void BubbleSortArray(char* array,int size,char mode);

功能:使用冒泡排序法进行排序

array:数组首地址

size:数组大小

mode:排序模式,' U '代表升序排序,' D '代表降序排序

2、void Print_Array(char* array,int size)

打印调试代码

具体代码实现如下:

cpp 复制代码
#include <stdio.h>

void BubbleSortArray(char* array,int size,char mode){
	
	int i,j;
	char SortFinishFlag = 1;
	
    if(array == NULL){
		printf("err:array is NULL\n");
        return;
	}

	//1.找到size-1个最大/小值,即可进行排序 
	for(j=0;j<size-1;j++){
		
		//2.比到上一个排到的末尾即可 
		for(i=0;i<size-1-j;i++){
			
			switch(mode){
				case 'U'://升序排序,小数在低位 
					if(array[i]>array[i+1]){
						array[i]   = array[i]^array[i+1];
						array[i+1] = array[i]^array[i+1];
						array[i]   = array[i]^array[i+1];
						SortFinishFlag = 0;
					}	
					break;
				case 'D'://降序排序,大数在低位
					if(array[i]<array[i+1]){
						array[i]   = array[i]^array[i+1];
						array[i+1] = array[i]^array[i+1];
						array[i]   = array[i]^array[i+1];
						SortFinishFlag = 0;
					} 
					break;
				default:
					printf("mode err\n");
					return;
			}
		}
		
		printf("Debug:MaxLoopNum = %d,NowLoopNum = %d\n",size-1,j);
		//数据无交换,提前退出 
		if(1 == SortFinishFlag){
				break;	
		}else{
			SortFinishFlag = 1;		
		} 	
	}	
}
/* 打印数组 */ 
void Print_Array(char* array,int size){
	
	int i;
	
	for(i=0;i<size;i++){
		printf("%d ",array[i]);
	}
}

int main(){
	
	char a[]={1,2,3,4,5};
	
	BubbleSortArray(a,sizeof(a)/sizeof(char),'U');
	Print_Array(a,sizeof(a)/sizeof(char));
	
	return 0;
} 

简单排序法

原理:

始终用未排序的第一个进行比较,依次与后面的值进行比较,如果顺序错误就交换。

代码接口说明如下:

1、void SimpleSelectSortArray(char* array,int size,char mode);

功能:使用冒泡排序法进行排序

array:数组首地址

size:数组大小

mode:排序模式,' U '代表升序排序,' D '代表降序排序

2、void Print_Array(char* array,int size)

打印调试代码

具体代码实现如下:

cpp 复制代码
#include <stdio.h>

void SimpleSelectSortArray(char* array,int size,char mode){
	
	int i,j;
	char SortFinishFlag = 1;
	
	if(array == NULL){
		printf("err:array is NULL\n");
		return;
	}
	
	for(i=0;i<size-1;i++){
		
		for(j=i+1;j<size;j++){
			switch(mode){
				case 'U'://升序,小数放低位 
					if(array[i]>array[j]){
						array[i] = array[i] ^ array[j];
						array[j] = array[i] ^ array[j];
						array[i] = array[i] ^ array[j];
						SortFinishFlag = 0;
					} 
					break;
				case 'D'://降序,大数放低位
					if(array[i]<array[j]){
						array[i] = array[i] ^ array[j];
						array[j] = array[i] ^ array[j];
						array[i] = array[i] ^ array[j];
						SortFinishFlag = 0;
					}
					break;
				default:
					printf("mode err"); 
			}
			
		}
		printf("Debug:MaxLoopNum = %d,NowLoopNum = %d\n",size-1,i);
		//数据无交换,提前退出 
		if(1 == SortFinishFlag){
			break;	
		}else{
			SortFinishFlag = 1;		
		} 		
	}
}
/* 打印数组 */ 
void Print_Array(char* array,int size){
	
	int i;
	
	for(i=0;i<size;i++){
		printf("%d ",array[i]);
	}
}
int main(){
	
	char a[]={1,2,3,4,5,6,7,8,9};
	
	SimpleSelectSortArray(a,sizeof(a)/sizeof(char),'U');
	Print_Array(a,sizeof(a)/sizeof(char));
	
	return 0;
}
相关推荐
祖力557 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省9 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
WWJA王文举9 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
白狐_79810 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25811 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记11 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
qq_4480111611 小时前
C语言中的动态内存分配
c语言·开发语言·php
杨航 AI11 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型12 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
动词ing12 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习