思想
堆,堆頂元素(即第乙個元素)必為最小項(小頂堆)(公升序序列)或者最大項(大頂堆)(降序序列)。若以一維陣列儲存乙個堆,則堆對應一棵完全二叉樹,且所有非葉結點的值均不大於(或不小於)其子女的值,根結點(堆頂元素)的值是最小(或最大)的。雖然說是一棵完全二叉樹,但不是說就得根據這些資料還需要重新建立資料結構,對於一維陣列有這樣的規定:
根節點i與左右孩子的下標的關係是:
左孩子:i*2+1
右孩子:i*2+2
每乙個孩子節點對應的雙親節點的下標是:(i-1)/ 2
通過如上的關係,就可以將一維陣列當做是乙個二叉樹來處理了。
實現
效率void adjustheap(int*arr,int begin,int
len);
//堆的初始化
void heap_init(int *arr,int
len)
}//堆的調整
void adjustheap(int*arr,int begin,int
len)
if (arr[begin] < arr[child])//如果較大的子節點大於父節點,
//那麼子節點就替換它的父節點
else
//如果當前節點大於它的左右孩子,就不需要調整,直接退出
arr[begin] = tmp;//將待調整的節點的值放到比它還大的孩子節點的位置上
}}void heap_sort(int *arr,int
len)
cout<<"heap_sort"
heap_init(arr,len);
//從最後乙個元素開始對序列進行調整
for (int i=len
-1;i >=0;i--)
}
堆排序也是屬於選擇排序的一種,但是它的效率是很高的,和快速排序不相伯仲,時間複雜度都是o(nlogn)。
思想1.在待排序的元素任取乙個元素作為基準(通常是選取第乙個元素,但最好的選擇方法是從待排序的元素中隨機選取乙個作為基準),稱為基準元素
2.將待排序的元素進行分割槽,比基準元素大的元素放在它的右邊,比它小的放在它的左邊;
3.對左右兩個分割槽重複以上的步驟直到所有的元素都是有序的。
遞迴實現
非遞迴實現int patition(int *arr,int l,int r)
arr[l] = arr[r];
while (arr[l] <=tmp && l < r)
arr[r] = arr[l];
}arr[l] = tmp;
return l;
}void quick(int *array,int start,int
end)
}void quick_sort(int*array,int num)
cout<<"quick sort"
}
效率void quick_sortrecursion(int*arr,int
len)
stackst;
intleft = 0;
intright = len-1;
st.push(left);
st.push(right);
while (!st.empty())
}}
和堆排序一樣的,都是屬於選擇排序,而且效率都是o(nlogn)。
現在就理解這麼多,還有個效率更高的歸併排序,後面再說吧,關於排序演算法中的其他幾個,見
這也是我的總結。繼續加油!^_^
排序演算法2 選擇排序
選擇排序 selection sort 通過多次比較和交換來實現排序,其排序流程如下 1.選取陣列中最小的乙個元素和陣列的第乙個元素交換。2.接著從剩下的所有元素中選擇最小的與第二個元素交換。3.和第二步同樣的方法對剩下的所有元素進行排序,最後便可得到按照從大到小的順序排好陣列中的各元素。具體過程如...
排序演算法(2) 希爾排序
希爾排序 先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄 基本有序 時,再對全體記錄進行依次直接插入排序。1 選擇乙個增量序列t1,t2,tk,其中ti tj,tk 1 2 按增量序列個數k,對序列進行k 趟排序 3 每趟排序,根據對應的增量ti,將待排序列分割成...
排序演算法2 氣泡排序
鏈結1 鄰居好說話 氣泡排序 啊哈!演算法 氣泡排序的核心部分是乙個雙重巢狀迴圈。時間複雜度為 o n2 o n 2 n n 為待排序的元素個數。以下是自己的 include include using namespace std 輸出陣列中的內容 void print int p,int num ...