排序演算法總結

2021-07-04 12:20:24 字數 3349 閱讀 9768

思想:一共進行n-1次比較(假定序列個數為n),每次比較重都會有乙個最大的元素沉底

#include

using

namespace

std;

void bubblesort(int a,int length)

}}

演算法思想:

在每次遍歷序列時,通過將該位值元素與之後序列中的元素直接比較,獲得最小的元素放到該位置

void selectsort(int a,int

length)

}}

思想:通過構建有序序列,對於為排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入

void straightinsertsort(int a,int

length)

}

思想:如果比較操作的代價比交換操作大的話,可以採用二分查詢法來減少比較操作的數目。該演算法可以認為是插入排序的一種變種,稱為二分查詢排序。

折半插入排序所需護甲儲存空間和直接插入排序相同。從時間上比較,折半插入排序僅減少了關鍵自檢的比較次數,而記錄的移動次數不變。

其實就是二分法查詢與插入排序的乙個組合,在已排好序的陣列中用二分法查詢出那個最合適的插入位置。

(找到的一般是比a[i]小的,即離其最近的乙個下標n),插入位置就是n+1

void binaryinsertsort(int a,int length)

for(j=i-1;j>=high && temp1]=a[j];

a[j+1]=temp;

}}

思想:

先取乙個小於n的整數d1作為第乙個增量,把序列中的全部元素分成d1組,所有距離為d1的倍數的記錄被放在同乙個組中,在各組內進行直接插入排序。然後,取第二個增量 d2

重複上訴的分組和排序,直至所取的增量dt

=1(d

t−1<..

..⋯) ,即所有元素放在同一組中進行直接插入排序為止

void shellinsert(int a,int

length,int dk)

}void shellsort(int a,int

length)

; shellsort(a,length,gap,9);

}

思想:

歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作。歸併操作的演算法原理為:

1.申請空間,使其大小為兩個已經排序序列之和,用來存放合合併後的序列

2.設定兩個指標,分別指向兩個已經排好序的序列的起始位置。

3.比較兩個指標所指向的元素,選擇相對較小的元素放入合併空間中,並移動指標到下乙個位置

4.重複步驟3,直到某一指標到達序列為

5將另一串行剩下的所有元素直接賦值到合併序列尾部

6.將排好序的合併空間的所有元素賦值給原序列

歸併排序的具體原理(假定序列共有n個元素):

1.將序列每相鄰兩個數字進行歸併操作(merge),形成floor(n/2)個序列,排序後的每個序列包含兩個元素

2.將上訴序列再次歸併,形成floor(n/4)個序列,每個序列包含四個元素。

3.重複步驟2,知道所有元素排序完畢

void merge(int *array,int first,int mid,int last)

while(begin1<=end1 && begin2<=end2) //小於等於

else

}while(begin1<=end1) //第一塊陣列長度先於第二塊陣列被存入新開闢記憶體中

while(begin2<=end2)

for(i=0;i//注意範圍

array[first+i]=temp[i]; //起始位址為first+i

free(temp);

}void mergesort(int *arr,int first,int last)

}void mergesort(int *arr,int length)

演算法思想:

從序列中挑出乙個元素,作為「基準」(pivot),重新排列序列,使得所有比基準值小的元素都交換到基準的前面,所有比基準大的元素都放在基準後面,這成為分割(partion)操作,然後遞迴將基準前面的序列和基準後面的序列進行分割操作,直到序列的大小為零或一,這是該序列已經排序好了。在每次迭代中,至少有乙個元素放置到了它最後應該在的位置。

int partition(int

*a,int first,int

last) //雙向排序

temp=a[i];

a[i]=a[last];

a[last]=temp;

return i;

}void qsort(int

*arr,int first,int

last)

}void quicksort(int

*arr,int

length)

演算法思想:

先將完全二叉樹以陣列的方式儲存,按照根節點—左子樹—右子樹的順序,首先建立大頂堆,然後將陣列中最後乙個元素與堆中第乙個元素交換,此時最大元素已排好序。將除最後乙個元素之外的剩下的元素重新建堆,迴圈往復下去直到堆為空。

typedef

int elemtype;

void heapadjust(elemtype h, int start,int end)

if(temp>h[i])

break;

h[start]= h[i];

start=i;

}h[start]= temp; //插入最開始的根節點元素

}void heapsort(elemtype a,int n)

}

測試主程式如下:

#include

using

namespace

std;

int main()

; //selectsort(a,10);

//bubblesort(a,10);

//straightinsertsort(a,10);

//binaryinsertsort(a,10);

//shellsort(a,10);

//mergesort(a,10);

//quicksort(a,10);

heapsort(a,10);

for(int i=0;i<10;i++)

cout

<" ";

cout

<}

排序演算法總結

1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...

排序演算法總結

1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...

排序演算法總結

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...