排序演算法空間、時間複雜度
簡單排序法—— 冒泡法是第二維迴圈中自己迴圈,找最小或最大值 選擇排序和交換排序是第二維迴圈與第一維迴圈中的值比較;交換法最清晰,選擇法作了改進,只交換位置標號,演算法複雜度沒變。 插入法,它的基本工作原理是抽出牌,在前面的牌中尋找相應的位置插入,然後繼續下一張(較為複雜)
進階排序法—— 快速排序,從冒泡法改進得到,基本思想是任選一個記錄,一般選取序列第一個,通過一趟排序將待排 記錄分割成相鄰的兩個地區,其中一個地區中記錄的關鍵字比另一個地區關鍵字都小,即一個地區的值都大於所取的關鍵字,另一個地區的指都小於所取的關鍵字, 則可以分別對這兩個地區的記錄進行排序,以達到整個序列有序。將它區別於SHELL排序,後者是先有一個遞減的步長數組,對相隔step-1的內容排列,然後改變步長,依次下去。 歸併排序,先在原記錄中找一個中間位置(low+high)/2,對兩段分別進行歸併排序,最後再整體排序(即分三次)。注意,快速排序沒有最後整體排序,但一開始先排了一次。 堆排序,對選擇排序的改進,利用堆的特性對記錄序列進行排序。
時間複雜度 冒泡排序、選擇排序和插入排序的比較次數為
O(n2),最壞情況
O(n2),最好
O(n)(但選擇排序最好是
O(n2))快速排序在平均情況下複雜性為
O(nlogn),最壞情況
O(n2),最好
O(nlogn)堆排序和合并排序在最壞情況下複雜性為
O(nlogn)。可見,合并排序和堆排序是比較排序演算法中時間複雜度最優演算法。
空間複雜度空間效能是排序所需輔助空間大小 所有簡單排序和堆排序都是0(1)快速排序為0(logn),要為遞迴程式執行過程棧所需的輔助空間歸併排序和基數排序所需輔助空間最多,為O(n) 看個小代碼#include <stdlib.h>main()
{ int m,n,p;
// scanf("m=%dn=%dp=%d",&m,&n,&p);
// printf("%d%d%d/n",m,n,p);
m=3;
n=m&(-1);p=m&&(-2);
printf("%d%d/n",n,p);
} 一、 n=m&(-1);中n恒等m p=m&&(-2);中p恒等1;(改稱0則p為0)了 -1的二進位為11;二、 屏蔽的兩句使用時,應該輸入 m=1n=2p=3不能 1 2 3