C基础--八大排序(个人笔记)

冒泡排序:两两对比交换

cs 复制代码
//该写法错误,应该把length放在Main方法
void bubble(int arr[]){
//数组参数传入的是指针
	int length = sizeof(arr)/sizeof(int); //此时length=2;
	for(int j=0;j<length;j++){
		for(int i=0;i<length;i++){
			if(arr[i]>arr[i+1]){
				int temp=arr[i];
				arr[i]=arr[i+1];
				arr[i+1]=temp;
			}
		}
	}
		for(int i=0;i<length;i++){
		printf("%d ",arr[i]);
	}
}

简单选择排序:每一轮从待排序的元素中选出最小(或最大)的一个元素,将其放在已排序序列的末尾,直到全部元素排序完成。

cs 复制代码
void simple(int arr[],int length){
	for(int i=0;i<length;i++){
		int minIndex=i; //记录最小值的位置
		for(int j=i+1;j<length;j++){
			if(arr[minIndex]>arr[j]){
				minIndex=j;
			}
		}
        //下标i的位置与最小值的位置进行交换
		int temp=arr[i];
		arr[i]=arr[minIndex];
		arr[minIndex]=temp;
	}
}

//主方法 
int main(){
	int arr[]={3,4,23,8,6,9,19};
	int length=sizeof(arr)/sizeof(int);
	simple(arr,length);
	for(int i=0;i<length;i++){
		printf("%d ",arr[i]);
	}
}

插入排序:将待排序的元素逐个插入到已排序序列的合适位置

cs 复制代码
//插入排序 
void insert(int arr[],int length){
	for(int i=1;i<length;i++){
		for(int j=i-1;j>=0;j--){
			if(arr[j+1]<arr[j]){
				int temp=arr[j+1];
				arr[j+1]=arr[j];
				arr[j]=temp;
			}
		}
	} 
}

//主方法 
int main(){
	int arr[]={3,4,23,8,6,9,19};
	int length=sizeof(arr)/sizeof(int);
	insert(arr,length);
	for(int i=0;i<length;i++){
		printf("%d ",arr[i]);
	}
}

希尔排序:将整个数组按照某个增量(gap)分组,对每组进行直接插入排序,然后逐步减小增量,直到增量为1时进行最后一次排序,最终使整个数组完全有序。

cs 复制代码
//希尔排序 
void insert(int arr[],int length){
	for(int h=length/2;h>=1;h/=2){
		for(int i=h;i<length;i++){
			for(int j=i-h;j>=0;j-=h){
				if(arr[j]>arr[j+h]){
					int temp=arr[j];
					arr[j]=arr[j+h];
					arr[j+h]=temp;
				}
			}
		}
	} 
}

快速排序:通过一趟排序将待排序列分成独立的两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再分别对这两部分进行排序,以达到整个序列有序。

(关于递归)--变量直接作为参数

cs 复制代码
void sort(int arr[],int left,int right,int i,int j){
	if(left>=right){
		return;
	}
	int base=arr[left];
	i=left;
	j=right;
	while(i!=j){
		while(arr[j]>=base && i<j){
			j--;
		}
		while(arr[i]<=base && i<j){
			i++;
		}
		int temp=arr[i];
		arr[i]=arr[j];
		arr[left]=temp;
	}
	arr[left]=arr[i];
	arr[i]=base;
	sort(arr,left,i-1,i,j);
	sort(arr,i+1,right,i,j);
	
}

归并排序:将待排序序列分成两个子序列,分别对子序列进行排序,然后将已排序的子序列合并成一个完整的有序序列。

相关推荐
§ꦿCFོ༉1 小时前
嵌入式八股—C语言入门学习(一)
c语言·编程语言·嵌入式八股文
Zhao-Jichao2 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李2 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
沐晓时光3 小时前
C语言入门,字符串和字符串函数知识讲解
c语言·开发语言
La Pulga4 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd4 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白5 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李6 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议
Zhao-Jichao8 小时前
AI Prompting for Everyone 课程笔记 - P20 实验与期末项目 Lab and Final Project
前端·人工智能·笔记
Z21-X9 小时前
云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析
运维·笔记·学习·云原生