時間複雜度為O(n)的排序演算法
阿新 • • 發佈:2018-11-24
我們常用的幾種排序演算法,氣泡排序,選擇排序,它們已經是相對比較簡單,穩定的排序演算法了,但是它們時間複雜度為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"); }
此演算法也可以很好的解決陣列元素重複的問題。
執行結果展示: