排序2 選擇排序 選擇排序 堆排序

2021-07-26 16:12:18 字數 2650 閱讀 8232

選擇排序,依次找到資料集n、n-1、n-2、....中比它大/小的最大/最小者,最終達到全部資料有序。

1、選擇排序:

直接的依次找到資料集合n、n-1、n-2.....的最大/最小者形成排序,非常好理解。選擇排序可能是和氣泡排序一樣,最直觀能想到的排序方法。

顯然選擇排序和氣泡排序一樣,無所謂最好、最壞、平均,選擇排序的時間複雜度 = o(n - 1) + o(n - 2) + ...... + o(1) -> o(n * n)

另外很顯然選擇排序是穩定的排序。

空間複雜度:可以認為幾乎沒有

select.h(類宣告):

#include #include templateclass selsort 

void ssort();

void show(bool direct);

};

select_func.h(類實現):

#include "select.h"

templateselsort::selsort (t *_data, int size)

ssort();

}templateselsort::selsort (std::vector_data)

templatevoid selsort::ssort ()

} t minval = data[min];

data[min] = data[i];

data[i] = minval; }}

templatevoid selsort::show (bool direct)

} } else

} }std::cout << std::endl;

}

select.cpp(測試程式):
#include "select_func.h"

#include int main ()

selsortselsorter(testdata, 30);

selsorter.show(1);

delete testdata;

return 0;

}

2、堆排序:

二叉堆本身可參考前面的文章:堆(二叉堆)

堆排序其實過程上和上面的選擇排序是一模一樣的,只是堆在建立後,堆頂資料已經是當前資料集的最大/小者,然後每次交換堆頂和尚未排序的堆底資料,然後對剩餘的資料進行堆排序,這樣就依次保證了堆底到堆頂的資料是逐漸排序了的。

因為堆本質是二叉樹,所以堆排序比上面的選擇排序的最大改進是,每次尋找最大/最小元素的效率由o(x)降低為o(logx),所以堆排序的時間複雜度是o(nl * ogn),最差、平均、最佳都認為是o(n * logn)。

但是堆排序要考慮建立堆的o(n) + n/2 * o(logn)的時間開銷。

堆排序也不穩定,原始排在後面的同值元素,堆排序後可能會在前面。

空間複雜度:可以認為幾乎沒有

heap.h(類宣告):

#include templateclass heapsort 

int rchild(int i)

int parent(int i)

public:

heapsort(t *data, int size);

heapsort(std::vector_data);

~heapsort()

void adjust(int i, int size);

void hsort();

void show(bool direct);

};

heap_func.h(類定義):

#include "heap.h"

#include templateheapsort::heapsort (t *_data, int size)

for (int i = data.size()/2; i >= 1; i--)

}templateheapsort::heapsort (std::vector_data)

for (int i = data.size()/2; i >= 1; i--)

}templatevoid heapsort::adjust (int i, int size)

if (r < data.size() && data[r] > data[maxidx])

if (maxidx != i) }}

templatevoid heapsort::hsort ()

}templatevoid heapsort::show (bool direct)

} } else

} }std::cout << std::endl;

}

heap.cpp(測試程式):

#include "heap_func.h"

#include int main ()

heapsortheapsorter(testdata, 30);

heapsorter.show(1);

heapsorter.hsort();

heapsorter.show(1);

delete testdata;

return 0;

}

排序 選擇排序 選擇排序 堆排序

寫在前面 上傳github交換排序選擇排序 堆排序 選擇排序 顧名思義,我們就可以猜到,它是原則合適的元素放到合適的位置 從圖中,我們可以得到 1.用第乙個元素,和其他所有的元素進行比較,找出最小的,然後進行交換 2.然後進行,資料的遞增 3.直到資料全部有序 void selectsort int...

排序 選擇排序(直接選擇排序 堆排序)

選擇排序 selection sort 的基本思想是 每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子檔案的最後,直到全部記錄排序完畢。常用的選擇排序方法有 直接選擇排序 和堆排序。直接選擇排序 straight selection sort 1 直接選擇排序的基本思想 n個記錄的檔...

排序演算法(2) 選擇排序 堆排序

繼續上篇的 交換排序 氣泡排序 快速排序,本篇介紹選擇排序和堆排序 一 選擇排序 非常的簡單直觀,每次找出最小或者最大的值儲存起來,繼續找剩下的值儲存起來,直達最後乙個元素。從arr 0 arr n 中找出最小的值,放在arr 0 此時arr 0 已經排好序 從arr 1 arr n 中找出最小的值...