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

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

相关推荐
INS_KF5 小时前
【编程笔记】成员函数中两个 const 的区别(const Data &getData() const;)
前端·javascript·笔记
CS_Zero5 小时前
C语言sizeof是函数吗?
c语言·开发语言
tju新生代魔迷6 小时前
Verilog HDL 学习笔记(十三)| 第13章 编程语言接口(PLI)
笔记·学习
点心的游戏开发世界7 小时前
UnityShaderGraph滚动UV笔记
笔记·uv
瑞码空间8 小时前
git知识点黄金笔记
笔记·git·elasticsearch
天若有情6739 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
Navigator_Z9 小时前
LeetCode //C - 1224. Maximum Equal Frequency
c语言·算法·leetcode
Navigator_Z10 小时前
LeetCode //C++ - 1226. The Dining Philosophers
c语言·算法·leetcode
摇滚侠11 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 JDBC 事务管理 阅读笔记 33
spring boot·笔记·后端
思麟呀11 小时前
嵌入式入门(一)宏观生态到首次烧录
c语言·嵌入式硬件