本程式參考了網上各位大牛和資料結構中的程式,vs2005執行通過,如有問題,請各位大牛指正。
實現的排序有:直接插入排序、折半插入排序、希爾排序、氣泡排序、快速排序、選擇排序、堆排序等等
#include
using
namespace
std;
const
intlen = 100;
class
csort
; csort::csort():length(len)
} csort::~csort()
void
csort::swap(
int& a,
int& b)
ostream& operator<<(ostream& cout,const
csort& csort)
coutcout;
} /*
插入排序思想:將乙個記錄插入到已經排好的有序表中,從而得到乙個新的、記錄增1的有序表,直到將所有待排記錄全部插入為止
*/class
cinsertsort :
public
csort
; //直接插入排序--小 到 大
void
cinsertsort::sort()
arr[j+1]=key;
} }
} class
binsertsort :
public
csort
; void
binsertsort::sort()
else
} //找到應該插入的位置high+1,之後移位置
intkey = arr[i];
for(
intj=i-1;j>=high+1;j--)
//已經找到位置,把要排序的數放入其中
arr[high+1]=key;
} }
class
cshellinsert :
public
csort
; void
cshellinsert::sort()
//呼叫希爾排序
;//設定希爾排序的增量,呼叫希爾排序函式
for(
inti=0;i<3;i++)
} void
cshellinsert::shellinsert(
intdk)
//希爾排序函式,把直接插入排序中的1變成dk就好,直接插入排序中增量為1
arr[j+dk]=key;
} }
} /*氣泡排序*/
class
bubblesort:
public
csort
; void
bubblesort::sort()
} } }
/*快速排序*/
class
cquicksort:
public
csort
; void
cquicksort::sort()
intcquicksort::partition(
intlow,
inthigh)
arr[low]=key;//這時第乙個洞的元素應該是在low處
return
low;
//返回這次劃分的位置
} void
cquicksort::quicksort(
intlow,
inthigh)
} class
cselectionsort:
public
csort
; void
cselectionsort::sort()
} if(k!=i)
} } class
cheapsort:
public
csort
; void
cheapsort::sort()
/*堆排序:
初始資料:儲存在陣列arr中
建立初始堆排序時,
首先把無序序列看成乙個完全二叉樹:處在0號元素的為根,12號為左右子樹之後一次化成完全二叉樹的形式畫樹
調整初始堆時,應該從最後乙個非葉子節點開始調整
在建立初始堆後,再進行調整堆,輸出序列
首先是堆頂元素(總是陣列的第乙個元素)和最後乙個未排好的元素交換(一直在變化),之後進行調整堆就好
調整堆時,總是自上而下的調整。即使是在建堆的時候也是這樣的。
注意:建初始堆和排序時的調整堆都需呼叫調堆函式heapadjust,兩種的不同之處在於調換元素和順序不同
*/void
cheapsort::heapsort()
//堆排序
for(int
j=length-1;j>0;j--)
} //要從小到大排序:建立大根堆,把頂端元素(陣列中第乙個元素)和陣列中 最後乙個未排 元素交換
//s表示調換的位置,m表示未排好序列的個數
void
cheapsort::heapadjust(
ints,
intm)
//調整推,變成大根堆
if(key > arr[i])
//這時,根儲存著最大值,不用調整(建立大根堆)
arr[s]=arr[i];
s=i;//這時,s應該指向剛剛調過去的位置,因為,在調整時,總是從上而下進行的,要從他的左孩子開始
} arr[s]=key;
} /*歸併排序*/
class
cmergingsort:
public
csort
; void
cmergingsort::sort()
void
cmergingsort::mergesort(
intleft,
intright)
} void
cmergingsort::merge(
intleft,
intmid,
intright)
else
} while
(i<=mid)
while
(j<=right)
for(i=0,k=left;k<=right;k++,i++)
//歸併後的陣列對應的原來的陣列是 left--right 那段,因此還要把這段資料放到原陣列中
delete
temp;
} int
main()
C 實現常見排序演算法
本程式參考了網上各位大牛和資料結構中的程式,vs2005執行通過,如有問題,請各位大牛指正。實現的排序有 直接插入排序 折半插入排序 希爾排序 氣泡排序 快速排序 選擇排序 堆排序等等 include using namespace std const int len 100 class csort...
幾種常見的排序演算法c 實現
一 選擇排序 演算法思想 對於有n個元素的陣列,一共有n躺排序,每趟排序要保證前i ii項元素已經排好序,對於第i ii趟排序,從第i ii個元素開始遍歷陣列,將當前遍歷元素中最小的值與第i個元素交換。具體 實現如下 include include include using namespace s...
常見排序演算法 C
時間複雜度o n 2 原地,穩定.void bubble sort vector int nums if flag break 如果沒有交換說明已經有序,跳出迴圈 return 時間複雜度o n 2 原地,穩定.void insert sort vector int nums nums i 1 va...