一、實驗目的
使用C++實現幾種常用的排序方法
二、實驗環境
GCC 4.9.2
三、實驗過程
3.1 冒泡排序
//冒泡排序,len爲數組長度
void bubbleSort(int data[],int len) {
for(int i = 0; i< len-1; i++) {
//用來記錄是否發生過交換
bool exchange = false;
for(int j = 0; j<len-1; j++) {
if(data[j] > data[j+1]) {
//如果有交換,則exchange爲 true
exchange = true;
swap(data[j],data[j+1]);
}
}
//如果此輪沒有發生交換,則說明已完成排序
if(exchange == false) {
break;
}
}
}
3.2 插入排序
void insertSort(int data[],int len) {
for(int i = 1; i<len; i++) {
if(data[i-1] > data[i]) {
//temp爲待插入元素
int temp = data[i];
int j = i - 1;
//從前一個元素位置開始,若未到表頭且當前位置元素大於temp
whlie(j >= 0 && temp < data[j]){
//所有元素依次向後移動
data[j+1] = data[j];
j--;
}
//此處就是爲插入temp留出的空(退出循環時j會多減1)
data[j+1] = temp;
}
}
}
3.3 選擇排序
void selectSort (int data[],int len) {
for(int i=0; i < len-1; i++) {
//基準碼最開始爲表頭元素下標
int index = i;
for(int j = i+1; j <= len-1; j++) {
//如果某位置元素小於基準位置元素
if(data[j] < data[index]) {
//更新基準碼
index = j;
}
}
//如果基準碼不是開始的那個,說明現位置的元素最小
if(index != i) {
//將最小的元素交換到起始位置
swap(data[i],data[index]);
}
}
}
3.4 快速排序
//left,reight代表數組左右區間大小
void quickSort(int data[],int left,int right) {
//index表示基準下標,index左側值均比data[index]小;右側值均比data[index]大
int index = left;
//設定基準元素,默認基準位置爲最左邊位置
int pivot = data[left];
for(int i = left+1 ; i<= right ; i++) {
if(data[i]< pivot) {
//基準下標右移
index++;
//如果待交換位置與該位置不重合
if(index != i) {
swap(data[i],data[index]);
}
}
}
//基準元素就位,基準位爲index
data[left] = data[index];
data[index] = pivot;
if(left < right) {
//對左側元素也進行同樣處理
quicksort(data,left,index-1);
//對右側元素也進行同樣處理
quicksort(data,index+1 ,right);
}
}
3.5 堆排序
//調整爲小根堆函數;start,end 表示待建堆區間
void siftDown(int data[],int start,int end) {
int parent = start;
int child = 2*parent+1;
//temp暫存子樹根節點
int temp = data[parent];
//如果左兒子編號未到終點
while(child < end) {
//如果右兒子比左兒子小
if(child+1 < end && data[child] < data[child+1]) {
//child變爲右兒子
child++;
}
// 如果根節點比兒子節點小,則不需要調整
if(temp >= data[child]) {
break;
}
//否則需調整兒子和雙親的位置
data[parent] = data[child];
//兒子上移變爲雙親
parent = child;
child = 2*child+1;
}
data[parent] = temp;
}
//堆排序函數
void heapSort(int data[],int len) {
for(int i = (len-2)/2; i>=0 ; i-- ) {
//建立一個小根堆
siftDown(data,i,len);
}
for(int i = len-1 ; i>0 ; i--) {
//交換根和最後一個元素,
swap(data[0],data[i]);
siftDown(data,0,i);
}
}