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

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

相关推荐
晓蛋3 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
傲世仙尊3 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿3 天前
重载、重写(覆盖)、重定义区别
c语言
phltxy3 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
phltxy3 天前
C 语言中的数据存储:从类型到二进制位
c语言
深圳老胡3 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
陈卫军老师3 天前
陈卫军:把口味写在一张纸上,店才稳得住
经验分享·笔记·流量运营