时间复杂度为O(n)的排序算法

我们常用的几种排序算法,冒泡排序,选择排序,它们已经是相对比较简单,稳定的排序算法了,但是它们时间复杂度为O(n*n),基本都要用到两层循环,今天我就像大家介绍一种简单,只用一层for循环,时间复杂度为O(n)的排序算法。

样例输入:1 4 5 6 3 4 2 8 9 1
样例输出:1 1 2 3 4 4 5 6 8 9

#include<stdio.h>
const int n=10;
//函数声明
void input(int *arr,int n);  //输入数组元素
void sort(int *arr,int n,int arr2[]);  // 排序算法
void output(int *arr,int n,int arr2[]);  //输出数组 

int main(){
	int a[n]={0};
	int a2[n]={0};  //定义一个数组初始化为0,用来按序存储原始数组各个元素的个数
	input(a,n);    
	printf("排序后为:        "); 
	sort(a,n,a2);
	output(a,n,a2);
}

void input(int *arr,int n)
{
	printf("请输入数字数组:    ");
	for(int i=0;i<n;i++){
		scanf("%d",&arr[i]);
	}
}

void sort(int *arr,int n,int arr2[]){  
	for(int i=0;i<n;i++){
		arr2[arr[i]]++;   //将原始数组中该元素的值作为新数组的下标,再存入元素的个数
	}
}

void output(int *arr,int n,int arr2[]){
	for(int i=0;i<n;i++){
		if(arr2[i]>0){  //数组元素不为0,表示该位置存的有元素
			for(int j=0;j<arr2[i];j++){ //遍历元素个数,依次输出
				printf("%2d",i);
			}
		}
	}
	printf("\n");
}


此算法也可以很好的解决数组元素重复的问题。

运行结果展示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40871196/article/details/84433572