C++實現幾種排序方法

一、實驗目的

使用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);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章