1.插入排序
直接插入排序是一種簡單的插入排序法,其基本思想是:把待排序的記錄按其關鍵碼值的大小逐個插入到乙個已經排好序的有序序列中,直到所有的記錄插入完為止,得到乙個新的有序序列 。
當插入第i(i>=1)個元素時,前面的array[0],array[1],…,array[i-1]已經排好序,此時用array[i]的排序碼與array[i-1],array[i-2],…的排序碼順序進行比較,找到插入位置即將array[i]插入,原來位置上的元素順序後移。
直接插入排序的特性總結:
1. 元素集合越接近有序,直接插入排序演算法的時間效率越高
2. 時間複雜度:o(n^2)
3. 空間複雜度:o(1),它是一種穩定的排序演算法
4. 穩定性:穩定
void insertsort(vectorarray)
//插入元素
array[end + 1] = key;
}}
1.1 希爾排序
希爾排序是插入排序基礎上的優化,基本思想是先選定乙個整數,將待排序陣列中的所有元素分成組(按距離分組),並對每一組內的記錄進行排序。重複上述分組和排序的工作,當到達==1時,所有記錄已排好序。
希爾排序的特性:
1.是對直接排序的優化。
2.品駿時間複雜度為o(n^1.3-n^2);
3.穩定性:不穩定
void shellsort(vectorarray)
array[end + gap] = key;//插入元素
} gap--;
}}
2.選擇排序
2.1直接選擇排序
每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,直到全部待排序的
資料元素排完 。
在元素集合
array[i]--array[n-1]
中選擇關鍵碼最大(小
)的資料元素
若它不是這組元素中的最後乙個
(第乙個
)元素,則將它與這組元素中的最後乙個(第乙個)元素交換
在剩餘的
array[i]--array[n-2]
(array[i+1]--array[n-1]
)集合中,重複上述步驟,直到集合剩餘
1個元素.
直接選擇排序的特性總結: 1.
缺陷:進行重複比較 2.
時間複雜度:
o(n^2) 3.
空間複雜度:
o(1) 4.
穩定性:不穩定
void selectsort(vectorarray)
if (maxpos != array.size() - 1 - i)//若不是當前排序最後乙個位置,進行交換
swap(array[array.size() - 1 - i], array[maxpos]);
}}
2.2堆排序
堆排序(heapsort)
是指利用堆積樹(堆)這種資料結構所設計的一種排序演算法,它是選擇排序的一種。它是
通過堆來進行選擇資料。
需要注意的是排公升序要建大堆,排降序建小堆。
堆排序的特性:
1. 效率高。
2. 時間複雜度:
o(n*logn)
3. 空間複雜度:
o(1)
4. 穩定性:不穩定
//向下調整
void heapadjustdown(vectorarray, int size, int parent)
else return;
}void heapsort(vectorarray)
}
堆向上調整,用於實現插入元素時
void heapadjiustup(vectorarray, int child)
else return;
} }
3.交換排序
根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排序的特點是:將較大的元素向序列的尾部移動,較小的元素向序列的前部移動。
3.1氣泡排序
特性:1.
時間複雜度:
o(n^2) 2.
空間複雜度:
o(1) 3.
穩定性:穩定
void bubblesort(vectorarray)
} if (flag == 0) return;//若有序則返回
}}
3.2快速排序
快速排序是
hoare
於1962
年提出的一種二叉樹結構的交換排序方法,其基本思想為:任取待排序元素序列中
的某元素作為基準值,按照該排序碼將待排序集合分割成兩子串行,左子串行中所有元素均小於基準值,右
子串行中所有元素均大於基準值,然後最左右子串行重複該過程,直到所有元素都排列在相應位置上為止。
將區間按照基準值劃分為左右兩半部分的常見方式有:
1. hoare
版本
2. 挖坑法
3. 前後指標版本
常見排序演算法
一.選擇排序 1.概念 每次從無序的子陣列裡面選擇最小的數,放在有序區的後面 既與無序區的首元素交換 不穩定排序 時間複雜度o n 2 輔助儲存o 1 2.實現 int selection sort int a,int len len為陣列元素個數 二.氣泡排序 1.概念 重複訪問數列n 1次,每次...
常見排序演算法
1 插入排序 直接插入排序,是一種最簡單的排序方法,它的基本操作是將乙個記錄插入到已排好序的有序表中,從而得到乙個新的 記錄數增1的有序表。初始 38 65 27 76 13 i 1 13 選13為監視哨並假設為乙個有序序列 i 2 13 38 待插入元素38 13 i 3 13 38 65 待插入...
常見排序演算法
排序演算法作為常用的基本演算法,今天就來總結一下各種經典排序演算法,這裡只貼出 對演算法的文字描述可以在課本或其它部落格上找到很多詳盡的敘述,這裡直接上 而不是常見演算法書上的偽 希望對正在努力學資料結構與演算法的朋友們有幫助 1 氣泡排序 void bubblesort t a,int n if ...