C 實現常見排序演算法

2021-06-26 05:04:23 字數 3360 閱讀 7762

本程式參考了網上各位大牛和資料結構中的程式,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...