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

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

相关推荐
IT方大同1 小时前
C语言分支与循环语句
c语言·开发语言·算法
星恒随风2 小时前
C++ 继承进阶:默认成员函数、多继承、虚继承与组合设计
开发语言·c++·笔记·学习
foo1st2 小时前
MySQL 8.0(Windows)升级笔记
数据库·笔记·mysql
呜喵王阿尔萨斯2 小时前
C/C++ const -- 多义混乱
c语言·开发语言·c++
caimouse3 小时前
MM 学习笔记 10:页面文件与系统加载器
笔记·学习·reactos
一只小菜鸡..3 小时前
南京大学 操作系统 (JYY) 学习笔记:Hello, OS World! (程序的机器视角)
java·笔记·学习
克里斯蒂亚诺更新12 小时前
ruoyi角色权限的对应关系
笔记
a11177615 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
人邮异步社区16 小时前
怎么把C语言学到精通?
c语言·开发语言