1.穩定性比較
插入排序、氣泡排序、二叉樹排序、二路歸併排序及其他線形排序是穩定的
選擇排序、希爾排序、快速排序、堆排序是不穩定的
2.時間複雜性比較
插入排序、氣泡排序、選擇排序的時間複雜性為o(n2)
其它非線形排序的時間複雜性為o(nlog2n)
線形排序的時間複雜性為o(n);
3.輔助空間的比較
線形排序、二路歸併排序的輔助空間為o(n),其它排序的輔助空間為o(1);
4.其它比較
插入、氣泡排序的速度較慢,但參加排序的序列區域性或整體有序時,這種排序能達到較快的速度。
反而在這種情況下,快速排序反而慢了。
當n較小時,對穩定性不作要求時宜用選擇排序,對穩定性有要求時宜用插入或氣泡排序。
若待排序的記錄的關鍵字在乙個明顯有限範圍內時,且空間允許是用桶排序。
當n較大時,關鍵字元素比較隨機,對穩定性沒要求宜用快速排序。
當n較大時,關鍵字元素可能出現本身是有序的,對穩定性有要求時,空間允許的情況下。
宜用歸併排序。
當n較大時,關鍵字元素可能出現本身是有序的,對穩定性沒有要求時宜用堆排序。
下面是各種排序的具體**:
1.插入排序
void insert(int *a,int2.氣泡排序(1)n)
a[j+1]=temp; /*
插入*/
}
}
其原理為從a[0]開始,依次將其和後面的元素比較,若a[0]>a[i],則交換它們,一直比較到a[n]。
同理對a[1],a[2],...a[n-1]處理,即完成排序。
void bubble(int *a,int3.氣泡排序(2)n)
} }
}
冒泡法還有第二種形式,或者叫沉底法也行:
每相鄰的兩個數進行比較,如果發現b[j]>b[j+1],則將b[j]向後移,最終是每次迴圈都把最大的數移到最後面
void bubble(int *b,int4.選擇排序n)
} }
}
選擇法迴圈過程與冒泡法1一致,它還定義了記號k=i,然後依次把a[k]同後面元素比較,若a[k]>a[j],則使k=j.
最後看看k=i是否還成立,不成立則交換a[k],a[i],這樣就比冒泡法省下許多無用的交換,提高了效率。
void choise(int *a,int5.快速排序n)
if(i!=min) /*
當min!=i是才交換,否則a[i]即為最小
*/
}
}
快速法定義了三個引數,(陣列首位址*a,要排序陣列起始元素下標i,要排序陣列結束元素下標j).
它首先選乙個陣列元素(一般為a[ (i+j)/2 ],即中間元素)作為參照,把比它小的元素放到它的左邊,比它大的放在右邊。
然後運用遞迴,在將它左,右兩個子陣列排序,最後完成整個陣列的排序。
void quick(int *a,int i,int6.「shell法」j)
} while(m<=n);
if(m
quick(a,m,j);
/*運用遞迴
*/if(n>i)
quick(a,i,n);
}
shell法是乙個叫 shell 的美國人與2023年發明的。
它首先把相距k(k>=1)的那幾個元素排好序,再縮小k值(一般取其一半),再排序,直到k=1時完成排序。
void shell(int *a,int7.二分排序n)
a[j+k]=x;
}
k/=2; /*
縮小間距值
*/}
}
1.二分插入排序的基本思想和插入排序一致;都是將某個元素插入到已經有序的序列的正確的位置;
2.和直接插入排序的最大區別是,元素a[i]的位置的方法不一樣;直接插入排序是從a[i-1]往前乙個個比較,從而找到正確的位置;而二分插入排序,利用前i-1個元素已經是有序的特點結合二分查詢的特點,找到正確的位置,從而將a[i]插入,並保持新的序列依舊有序;
3.時間複雜度:
t(n) = o(n);
void sort(inta)
else
}for(int j = i-1;j>=low;j--)
a[low] =key;
}}
幾種常見的排序演算法及實現(一)
1 選擇排序 基本原理 對於給定的一組記錄,經過第一輪比較後得到最小的記錄,然後將該記錄與第乙個記錄的位置進行交換 接著對不包含第乙個記錄以外的其他記錄進行第二輪比較,得到最小的記錄並與第二個記錄進行位置交換 重複該過程,直到進行比較的記錄只有乙個時為止。void selectsort int a,...
幾種常見的排序演算法
氣泡排序演算法的運作如下 1 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。3 針對所有的元素重複以上的步驟,除了最後乙個。4 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要...
幾種常見的排序演算法
1.氣泡排序 void bubble sort int array,int n if 1 flag break printf d i return 2.快速排序 好 void quicksort int a,int left,int right left是選擇的軸點,如0,表示這個資料為軸點,rig...