1. 程式人生 > >時間複雜度為O(n)的排序演算法

時間複雜度為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");
}


此演算法也可以很好的解決陣列元素重複的問題。

執行結果展示:
在這裡插入圖片描述