所謂排序就是計算機內經常進行的一種操作,其目的就是將一組"無序"的資料元素調整為"有序"的資料元素,排序也存在穩定性的定義:如果在序列中有兩個資料元素r[i]和r[j],它們的關鍵字(排序的依據)k[i]==k[j],且在排序之前,物件r[i]排在r[j]前面,如果在排序之後,物件r[i]仍在物件r[j]的前面,則稱這個排序方法是最穩定的,否則稱這個排序方法是不穩定的,在排序中也有多關鍵字排序,所謂多關鍵字排序就是有多個排序依據,且它們的優先順序不同,當優先順序相同時則看一下關鍵字,對於多關鍵字排序,只要在比較操作同時考慮多個關鍵字和定義好關鍵字優先順序,多關鍵字和單關鍵字在排序上是沒有本質區別的,排序的兩個關鍵操作就是比較和交換
例子
#include
#include
"object.h"
using
namespace std;
using
namespace cgslib;
template
<
typename t>
class
test
bool
operator==(
const test& t)
bool
operator!=(
const test& t)
bool
operator
>
(const test& t)
bool
operator
<
(const test& t)
bool
operator
<=
(const test& t)
bool
operator
>=
(const test& t)};
intmain()
結果:
1
可以看出只要定義好關鍵字優先順序,多關鍵字排序和單關鍵字排序沒有本質上的區別,排序的時間效能是區分排序演算法好壞的主要因素,下面抽象出排序類的基類
#ifndef sort_h
#define sort_h
#include
"object.h"
class sort : public object
public:
//....};
#endif
// sort_h
基本思想每次(例如第i次,i = 0,1,…,n-2)從後面n-i個待排的資料元素中選出關鍵字最小的元素,作為有序元素序列第i個元素,如下圖所示有序序列部分在不斷增加而無序序列部分在不斷減少
下圖是動畫演示過程,可見將無序區的資料不斷的搬移到有序區最後就形成的有序的狀態,可以看出為不穩定排序
**演示:
static
void
select
(t array,
int len,
bool min2max =
true)}
if(min != ii)
//如果min和j不相等則交換,否則如上圖中圖4,圖5一樣無須交換
}}
main.c
#include
#include
"sort.h"
using namespace std;
using namespace cgslib;
intmain()
; sort:
:select
(array,
5,false)
;//從大到小排
for(
int i=
0;i<
5;i++
) cout<
<
return1;
}
結果
基本思想
當插入第i(i>=1)個資料元素時,前面的v[0],v[1],…v[i-1]已經排好序,這時,用v[i]的關鍵字與v[i-1],v[i-2],…v[0]的關鍵字進行比較,找到位置後將v[i]插入,原來位置上的物件向後順移,如下圖所示,每次在無序序列區域加入乙個元素到有序序列區域的特定位置,並使有序序列依舊有序
下圖是動畫演示過程,可以看出剛開始把第乙個元素當作有序序列區域的第乙個元素,後面不斷從無序序列區域移動第乙個元素加入到有序序列區域,每一次加入都選擇正確的位置插入使其依舊保持有序,簡單來說,我們看到第6步,將08從無序序列加入到有序序列時,先將08和49比較,發現49比08大則49後移直到08大於比較數就插入,而且從圖中的25可以看出插入排序為穩定排序
**演示
template
static
void
insert
(t array,
int len,bool min2max = true)
else}if
(k!=i)
//判斷是否需要交換
array[k]
= e;
//進行插入
插入排序和選擇排序都是用兩個for迴圈,所以時間複雜度都為o(n*n)
選擇排序和插入排序
選擇排序 時間複雜度 o n 2 額外空間複雜度o 1 選擇排序是從陣列的第乙個值即arr 0 開始,先假定當前值為最小值,記下index值,向後遍歷陣列,當 arr i 小於arr index 時,令index i 一直到arr length 1 獲得最小值的index然後與arr 0 交換,此時...
插入排序和選擇排序
排序 將一組雜亂無章的資料按照一定的規則有組織地排列起來。排序的穩定性 如果在排序中,存在前後相同的兩個元素的話,排序前和排序後他們的相對位置不發生變化。今天,先來學習插入排序和選擇排序 插入排序 直接插入排序 1 思想 每一步將乙個待排序的元其排序碼的大小,插入到前面已將排好序的一組元素的合適位置...
插入排序和選擇排序
插入排序 插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的 個數加一的有序資料。從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 已排序 大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者...