蓝桥刷题note13(排序)

1.冒泡排序

适用场景:

数据量较小:适用于数据量较小的情况,例如数组长度在 10 以内。

优点

稳定性:冒泡排序是一种稳定的排序算法,相同元素的相对顺序不会改变。

缺点

时间复杂度高:平均和最坏时间复杂度为 O(n^2) ,效率较低。

不适用于大数据量:对于较大的数据量,排序时间会显著增加。

cpp 复制代码
#include <stdio.h>
 #include<stdlib.h>
void swap(int *a,int *b){
	int temp=*a;
	*a=*b;
	*b=temp;
}
void pao_sort(int *arr,int length){
	for(int i=0;i<length-1;i++){
		for(int j=0;j<length-1-i;j++){
			if(arr[j]>arr[j+1]){
				swap(&arr[j],&arr[j+1]);
			}
		}
	}
}

int main(){
	int arr[5]={3,1,2,5,4};
	pao_sort(arr,5);
	for(int i=0;i<5;i++){
		printf("%d ",arr[i]);
	}
	return 0;
}

2.选择排序

每次选择最小的元素排在第一位

缺点:

数据量较小:适用于数据量较小的情况,例如数组长度在 10 以内。

时间复杂度高:平均和最坏时间复杂度为 O(n^2) ,

cpp 复制代码
#include <stdio.h>
 #include<stdlib.h>
void swap(int *a,int *b){
	int temp=*a;
	*a=*b;
	*b=temp;
}
void selection_sort(int *arr,int length){
	for(int i=0;i<length-1;i++){
	int min=i;
	for(int j=i+1;j<length;j++){
		if(arr[j]<arr[min]){
			min=j;
		}
	 }
	if(min!=i){
		swap(&arr[i],&arr[min]);
	 }
	}
}

int main(){
	int arr[5]={3,1,2,5,4};
	selection_sort(arr,5);
	for(int i=0;i<5;i++){
		printf("%d ",arr[i]);
	}
	return 0;
}

3.归并排序

将数组不断从中间拆分直至不可再分再按次序合并。

适用于大数据量、需要稳定排序的场景,尤其是链表排序和外部排序。

平均和最坏时间复杂度为 O(n log n)

cpp 复制代码
#include <stdio.h>
 #include<stdlib.h>

void merge(int *arr,int left,int mid,int right){
	int n1=mid+1-left;
	int n2=right-mid;

    int *L = (int *)malloc(n1 * sizeof(int));
    int *R = (int *)malloc(n2 * sizeof(int));

	for(int i=0;i<n1;i++){
		L[i]=arr[left+i];
	}
	for(int j=0;j<n2;j++){
		R[j]=arr[mid+1+j];
	}

	int i=0,j=0,k=left;
	while(i<n1&&j<n2){
		if(L[i]<=R[j]){
		arr[k]=L[i];
		i++;
		}
		else{
		arr[k]=R[j];
		j++;
		}
		k++;
	}
	while(i<n1){
		arr[k]=L[i];
		i++;
		k++;
	}
	while(j<n2){
		arr[k]=R[j];
		j++;
		k++;
    }
}

void merge_sort(int *arr,int left,int right){
	if(left<right){
		int mid=(left+right)/2;
	
	merge_sort(arr,left,mid);
	merge_sort(arr,mid+1,right);

	merge(arr,left,mid,right);
	}
}
int main(){
	int arr[5]={3,1,2,5,4};
	merge_sort(arr,0,4);
	for(int i=0;i<5;i++){
		printf("%d ",arr[i]);
	}
	return 0;
}

4.快速排序

设置一个参照数,比起小的排至其左边,大的排到右边。

平均时间复杂度为 O(n log n)

最坏时间复杂度为 O(n^2) ,当数组已经部分有序时,性能会下降。

cpp 复制代码
#include <stdio.h>
 #include<stdlib.h>
 
void quick_sort(int *arr,int low,int high){
	if(low<high){
	int left=low;
	int right=high;
	int pivot=arr[low];
	while(left<right){
		while(arr[right]>pivot&&left<right){
			right--;
		}
		if(left<right){
			arr[left]=arr[right];
			left++;
		}
		while(arr[left]<pivot&&left<right){
			left++;
		}
		if(left<right){
			arr[right]=arr[left];
			right--;
		}
	}
	arr[left]=pivot;
	quick_sort(arr, low, left - 1);
    quick_sort(arr, left + 1, high);
	}
}
int main(){
	int arr[5]={3,1,2,5,4};
	quick_sort(arr,0,4);
	for(int i=0;i<5;i++){
		printf("%d ",arr[i]);
	}
	return 0;
}
相关推荐
qinian_ztc1 分钟前
frida 14.2.18 安装报错解决
算法·leetcode·职场和发展
良木生香4 分钟前
【C++初阶】C++入门相关知识(2):输入输出 & 缺省参数 & 函数重载
开发语言·c++
小此方4 分钟前
Re:从零开始的 C++ 进阶篇(三)彻底搞懂 C++ 多态:虚函数、虚表与动态绑定的底层原理
c++
忘梓.5 分钟前
墨色规则与血色节点:C++红黑树设计与实现探秘
java·开发语言·c++
hhh3u3u3u6 分钟前
Visual C++ 6.0中文版安装包下载教程及win11安装教程
java·c语言·开发语言·c++·python·c#·vc-1
AI应用实战 | RE6 分钟前
012、检索器(Retrievers)核心:从向量库中智能查找信息
人工智能·算法·机器学习·langchain
凤年徐8 分钟前
C++手撕红黑树:从0到200行,拿下STL map底层核心
c++·后端·算法
星河耀银海8 分钟前
C++ 模板进阶:特化、萃取与可变参数模板
java·开发语言·c++
Thomas.Sir11 分钟前
AI 医疗之罕见病/疑难病辅助诊断系统从算法到实现【表型驱动与知识图谱推理】
人工智能·算法·ai·知识图谱
cccccc语言我来了12 分钟前
【C++---unordered_set/map底层封装】个不拘一格的集合。它不似有序集合那般循规蹈矩,而是以一种洒脱不羁的方式,将元素们随意地散落其中。每一个元素都是独一无二的。
开发语言·c++·哈希算法