一種金字塔排序算法
【技術領域】
[0001 ]本發明涉及一種金字塔排序算法。
【背景技術】
[0002]當前,對大量數據進行排序時,通常選擇的是快速排序算法。快速排序是性能優異的排序算法,但是若快速排序基準值選擇不當或待排序序列基本有序時,快速排序的性能會大幅度降低。而堆排序在待排序序列基本有序的情況下比快速排序快,但是堆排序也有缺點:當待排序元素為復雜的數據結構時,由于堆排序中無效移動次數比較多,對堆排序性能也有較大影響。
【發明內容】
[0003]本發明的目的是提供一種金字塔排序算法,在待排序序列基本有序情況下以及待排序元素具有復雜的數據結構的情況下,提升排序速度。
[0004]實現本發明目的的技術方案是:一種金字塔排序算法,包括以下步驟:
[0005]①、對η個數據進行排序時,先定義一個具有η個單元的a數組,然后找到一個整數m,m為2的整數次冪,并且m/2<n < m;
[0006]②、定義一個具有m個單元的b數組,b數組構成金字塔的塔基;再定義一個具有m個單元的c數組,c數組構成金字塔的塔身;
[0007]③、對c數組進行初始化,將需要排序的η個數據放入b數組中,并在b數組中放入m_n個最小值數據,該最小值數據為η個數據中的最小值數據,形成m/2對相鄰數據;然后將其逐一比較,將相對大數的下標放入c數組的m/2?m-Ι單元中,此過程形成金字塔第I層塔身;
[0008]@、從!11-1開始,逐個比較13[(3[111-1]]和13[(3[111-2]]、13[(3[111-3]]和13[(3[111-4] ]、......、b
[c[m/2+l]]和b[c[m/2]],并將相對大數的下標放入c[m/2-l]、c[m/2-2]、......、c[m/4]中,
依此類推形成金字塔第2、第3……乃至最高一層塔身,由此構建整個塔身,最后整個b數組最大值數據的下標會被放入c [ I ]中;
[0009]⑤、為步驟④得到的b數組中的最大值數據賦以最小值;
[0010]⑥、重復步驟④和步驟⑤,從而不斷找出b數組中的最大值,并將其逐個放入a[0]、a[l]、a[2]......,完成排序。
[0011]所述步驟①中整數m的找尋方法為:給一個變量賦值為I,然后比較該變量和η的值,若它小于η,則將其乘以2,再次進行比較它和η的值,……,直到該數據大于等于η為止,此時該變量的值即為m。
[0012]所述步驟③中的相鄰數據是指下標為奇數的數據與其前面的數據為相鄰數據,與其后面的數據不是相鄰數據。
[0013]采用了上述技術方案,本發明具有以下的有益效果:本發明在通常情況下的排序速度略低于快速排序,但是在待排序序列基本有序情況下,本發明的排序速度明顯優于快速排序,并且在對待排序元素為較復雜的數據結構進行排序的情況下,本發明的排序速度明顯優于堆排序。
【具體實施方式】
[0014](實施例1)
[0015]本實施例的金字塔排序算法,包括以下步驟:
[0016]①、對η個數據進行排序時,先定義一個具有η個單元的a數組,然后找到一個整數m,m為2的整數次冪,并且m/2<n < m。
[0017]整數m的找尋方法為:給一個變量賦值為I,然后比較該變量和η的值,若它小于n,則將其乘以2,再次進行比較它和η的值,……,直到該數據大于等于η為止,此時該變量的值即為m0
[0018]②、定義一個具有m個單元的b數組,b數組構成金字塔的塔基;再定義一個具有m個單元的c數組,c數組構成金字塔的塔身。
[0019]③、對C數組進行初始化,將需要排序的η個數據放入b數組中,并在b數組中放入m_n個最小值數據,該最小值數據為η個數據中的最小值數據,形成m/2對相鄰數據;然后將其逐一比較,將相對大數的下標放入c數組的m/2?m-Ι單元中,此過程形成金字塔第I層塔身。
[0020]相鄰數據是指下標為奇數的數據與其前面的數據為相鄰數據,與其后面的數據不是相鄰數據,即b[2i]和b[2i+l]為相鄰數據(其中i為整數),而b[2*i]和b[2*1-l]不是相鄰數據。比如b [ O ]和b [ I ]是相鄰數據,而b [ I ]和b [ 2 ]不是相鄰數據。
[0021 ] (|)、從111-1開始,逐個比較13[(3[111-1]]和13[(3[111-2]]、13[(3[111-3]]和13[(3[111-4] ]、......、b
[c[m/2+l]]和b[c[m/2]],并將相對大數的下標放入c[m/2-l]、c[m/2-2]、......、c[m/4]中,
依此類推形成金字塔第2、第3……乃至最高一層塔身,由此構建整個塔身,最后整個b數組最大值數據的下標會被放入c [ I ]中。
[0022]⑤、為步驟④得到的b數組中的最大值數據賦以最小值。
[0023]⑥、重復步驟④和步驟⑤,從而不斷找出b數組中的最大值,并將其逐個放入a[0]、a[l]、a[2]......,完成排序。
[0024]以上所述的具體實施例,對本發明的目的、技術方案和有益效果進行了進一步詳細說明,所應理解的是,以上所述僅為本發明的具體實施例而已,并不用于限制本發明,凡在本發明的精神和原則之內,所做的任何修改、等同替換、改進等,均應包含在本發明的保護范圍之內。
【主權項】
1.一種金字塔排序算法,其特征在于:包括以下步驟: ①、對η個數據進行排序時,先定義一個具有η個單元的a數組,然后找到一個整數m,m為2的整數次冪,并且m/2<n<m; ②、定義一個具有m個單元的b數組,b數組構成金字塔的塔基;再定義一個具有m個單元的c數組,c數組構成金字塔的塔身; ③、對c數組進行初始化,將需要排序的η個數據放入b數組中,并在b數組中放入m-n個最小值數據,該最小值數據為η個數據中的最小值數據,形成m/2對相鄰數據;然后將其逐一比較,將相對大數的下標放入c數組的m/2?m-Ι單元中,此過程形成金字塔第I層塔身; ④、從m-Ι開始,逐個比較b[c[m_l] HPb[c[m-2] ]、b[c[m_3]]和b[c[m_4] ]、......、b[c[m/2+1]]和b[c[m/2]],并將相對大數的下標放入c[m/2-l]、c[m/2-2]、......、c[m/4]中,依此類推形成金字塔第2、第3……乃至最高一層塔身,由此構建整個塔身,最后整個b數組最大值數據的下標會被放入c [ I ]中; ⑤、為步驟④得到的b數組中的最大值數據賦以最小值; ⑥、重復步驟④和步驟⑤,從而不斷找出b數組中的最大值,并將其逐個放入a[0]、a[l]、a[2]……,完成排序。2.根據權利要求1所述的一種金字塔排序算法,其特征在于:所述步驟①中整數m的找尋方法為:給一個變量賦值為I,然后比較該變量和η的值,若它小于n,則將其乘以2,再次進行比較它和η的值,……,直到該數據大于等于η為止,此時該變量的值即為m。3.根據權利要求1所述的一種金字塔排序算法,其特征在于:所述步驟③中的相鄰數據是指下標為奇數的數據與其前面的數據為相鄰數據,與其后面的數據不是相鄰數據。
【專利摘要】本發明公開了一種金字塔排序算法,先找到一個為2的整數次冪的整數m,m/2<n≤m;然后將需要排序的n個數據放入b數組中;然后逐一比較b數組中相鄰數據,將相對大數的下標放入c數組的m/2~m-1單元中;然后逐個比較b[c[m-1]]~b[c[m/2]]中的相鄰數據,并將相對大數的下標放入c[m/2-1]~c[m/4]中,依此類推,最后整個b數組最大值數據的下標會被放入c[1]中;然后不斷找出b數組中的最大值,完成排序。在待排序序列基本有序情況下,本發明的排序速度明顯優于快速排序,并且在對待排序元素為較復雜的數據結構進行排序的情況下,本發明的排序速度明顯優于堆排序。
【IPC分類】G06F19/00
【公開號】CN105574344
【申請號】CN201510975288
【發明人】呂勇, 劉斌
【申請人】常州信息職業技術學院
【公開日】2016年5月11日
【申請日】2015年12月22日