各種排序,歸併排序,快速排序,堆排序

2021-06-18 15:29:01 字數 1695 閱讀 3588

快速排序:選中乙個元素,將比該元素小的元素放在其左側,比該元素大的放在其右側,然後將該元素放在正確的位置。然後對左側和右側的所有元素依次進行以上操作。

以首元素作為比較元素c

初始化i為0,j為len-1

找到右邊第乙個比c小的數字a[j],放在i位置

找到左邊第乙個比c大的數字a[i],放在j位置

重複3、4,直到i,j重合

template void quicksort(t* src, int firstposition, int lastposition)

src[iposition] = compareelement;

quicksort(src, firstposition, iposition - 1);

quicksort(src, iposition + 1, lastposition);

}

歸併排序:假定陣列左右兩側的資料都已經有序,則只要把這兩組資料從頭開始掃瞄排序即可

對左邊部分進行歸併排序

對右邊部分進行歸併排序

合併左右兩部分

template void merge(t* src, int leftstart, int leftend, int rightend)

while (leftposition <= leftend)

cachedvalue[cachedposition++] = src[leftposition++];

while (rightposition <= rightend)

cachedvalue[cachedposition++] = src[rightposition++];

cachedposition = 0;

leftposition = leftstart;

while (leftposition <= rightend)

src[leftposition++] = cachedvalue[cachedposition++];

delete cachedvalue;

}template void mergesort(t*src, int leftstart, int rightend)

堆排序:假定存在乙個最大堆,則每次從堆頂上取出的元素都是堆裡面的最大元素

構造最大堆

取堆頂的元素

重新構造最大堆

template void makeheap(t* src, int rootposition, int lastposition)

else break;

}}template void heapsort(t* src, int start, int end)

}

插入排序:將無序的每乙個元素依次插入到有序的序列中

選擇排序:每次選擇乙個元素並將其放入序列

氣泡排序:每次比較相鄰的兩個元素

shell排序:通過減小間隔依次進行插入排序

so:穩定排序:

插入排序

選擇排序

氣泡排序

歸併排序

不穩定排序:

shell排序:在多次插入排序的過程中可能出現亂序的情況

快速排序:在移動時,如果乙個元素移動,會引起兩個元素都移動,從而亂序

堆排序:在生成堆時,有可能亂序

快速排序 堆排序 歸併排序

快速排序 includeusing namespace std int a 8 int sz sizeof a sizeof int int partition int a,int p,int r int main const int sz sizeof a sizeof int 堆化 保持最大堆的...

快速排序,歸併排序,堆排序

l r 1在奇數長度陣列的中間,偶數長度陣列的左半邊最後乙個,極限情況下陣列只有兩個數,i遇到第乙個數就會停下,此時模擬i,j下標的數有無交換的情況,會發現j在停下來時都位於第乙個數的位置,因此用j,j 1才不會越界 l r 1 1在奇數長度陣列的中間往右第乙個,偶數長度陣列的右半邊第乙個,極限情況...

氣泡排序,快速排序,堆排序,歸併排序

1.氣泡排序 1 基本思想 從無序序列頭部開始,進行兩兩比較,根據大小交換位置,直到最後將最大 最小 的資料元素交換到了無序序列的隊尾,從而成為有序序列的一部分 下一次繼續這個過程,直到所有資料元素都排好序。演算法的核心在於 每次通過兩兩比較交換位置。選出剩餘無序序列裡最大 最小 的資料元素放到隊尾...