1. 程式人生 > >看資料結構寫程式碼(63) 堆排序

看資料結構寫程式碼(63) 堆排序

// HeapSort.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include <cstdlib>
#define LIST_MAX_SIZE 100
//順序表
struct sqList{
	int base[LIST_MAX_SIZE];
	int len;
};

typedef sqList Heap;//順序表作為堆排序的基本型別

//初始化順序表
void initHeap(Heap * list,int * array,int len){
	//0號單元不儲存.
	for (int i = 0; i < len; i++){
		list->base[i+1] = array[i];
	}
	list->len = len;
}


//向下篩選(最小堆)
void siftDown(Heap *h,int i){
	int len = h->len;
	int minIndex = i;
	bool finished = false;//完成標誌
	for (int j = 2 * i; j <= len && finished == false; j= 2 * i){
		if (h->base[j] < h->base[i]){
			minIndex = j;
		}
		if (j + 1 <= len){
			if (h->base[j+1] < h->base[minIndex]){
				minIndex = j + 1;
			}
		}
		if (minIndex != i){
			int temp = h->base[minIndex];
			h->base[minIndex] = h->base[i];
			h->base[i] = temp;
			i = minIndex;
		}
		else{
			finished = true;//完成篩選。
		}
	}
}

//建立堆
void createHeap(Heap * h){
	int len = h->len;
	for (int i = len / 2; i >= 1; i--){
		siftDown(h,i);
	}
	printf("---------------建立堆---------------\n");
	for (int i = 1; i <= h->len; i++){
		printf("%d\t",h->base[i]);
	}
	printf("\n");
}

void heapSort(Heap h){
	printf("---------------堆排序---------------\n");
	for (int i = h.len; i >= 1; i--){
		printf("%d\t",h.base[1]);
		h.base[1] = h.base[i];
		h.len--;
		siftDown(&h,1);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int testArray[10] = {77,66,44,33,11,22,55,99,88,100};
	Heap h;
	initHeap(&h,testArray,10);
	createHeap(&h);
	heapSort(h);
	return 0;
}

具體程式碼解釋 看 上面的 兩個網址就行了,然後 給 《啊哈磊》 贊 一個。