選擇排序,依次找到資料集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 中找出最小的值...