我们常用的几种排序算法,冒泡排序,选择排序,它们已经是相对比较简单,稳定的排序算法了,但是它们时间复杂度为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");
}
此算法也可以很好的解决数组元素重复的问题。
运行结果展示: