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);
	
}

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

相关推荐
xqqxqxxq9 小时前
Redis 五大常用数据类型 + 通用命令笔记
数据库·redis·笔记
zjnlswd9 小时前
c# 刘铁猛 学习笔记
笔记·学习
LuminousCPP9 小时前
单链表专题(三)-刷题复盘篇:从快慢指针到环形链表 II 数学推导
数据结构·经验分享·笔记·学习·算法·链表
不正经学生10 小时前
C语言字符串函数进阶:安全版函数 + 错误处理 + 子串查找
c语言·开发语言·c++·算法·面试
3A Cloud10 小时前
从「心即理」到提示词工程:深度解析 ClawHub 上的阳明心学技能(yangming-xinxue)
人工智能·笔记
你想知道什么?10 小时前
朴素贝叶斯算法-学习笔记
笔记·学习·算法
天吾cc10 小时前
JSON 与 cJSON 学习笔记
笔记·学习·json
一米阳光866110 小时前
软考(中级)软件设计师核心笔记(8)数据结构——树与二叉树
数据结构·笔记·职场发展·软考·软件设计师·中级职称
是上好佳佳佳呀11 小时前
【深度学习|DAY04】神经网络深度学习笔记(下):损失函数、优化器与正则化
笔记·深度学习·神经网络
砚凝霜13 小时前
软考网络工程师|第 9 章 网络诊断命令 + 故障工具 + 故障排查完整笔记
网络·笔记