經常使用高級排序算法

首先初始化了一個MAX大小的數組,用亂序函數將數組打亂,用於測試各個排序函數,先附上要測試的幾個基礎排序函數,後面附上亂序函數和主調度函數。代碼就那麼幾行,只是註釋的思亂佔了比較多的行數shell

快速排序數組

//快速排序,思想的重點是 遞歸+分組(分治)+先後交叉操做
void quickSort(int *array, int low, int hight)
{
	//判斷是否知足條件
	if (hight <= low)	//若是隻有一個元素或者先後錯位了,就不用排序了,一個元素就是成序的
		return;
	//知足排序條件,進入排序部分
	int i = low, j = hight;	//定義函數內的臨時變量爲low和hight的副本,避免修改low和 hight,後面還要使用
	int temp = array[low];
	//對整個序列進行一次篩選,以目標值爲分割點,只有當i<j時表示遍歷沒有完成,須要繼續遍歷
	while (i < j){
		while (i<j && array[j]>temp){
			j--;
		}
		if (i < j){
			array[i++] = array[j];
		}
		while (i < j && array[i] < temp){
			i++;
		}
		if (i < j){
			array[j--] = array[i];
		}
	}
	//循環跳出,證實i=j,遍歷相遇,一輪篩選完成,將目標數放在中間
	array[i] = temp;
	//遞歸部分
		//將前半部分交給快排函數
	quickSort(array, low, i - 1);
		//將後半部分交給快拍函數
	quickSort(array, i + 1, hight);
}

shell排序(基於插入排序)函數

//shell排序(希爾排序)
void shellSort(int *array, int size, int d)
{
	//循環1 控制步長的循環
	for (int increment = d; increment > 0; increment /= 2){
		//循環2 屬於插入排序內容,控制遍歷次步長能夠訪問到的元素
		for (int i = increment; i < size; i += increment){
			int temp = array[i];
			int j = i - increment;
			//循環3 屬於插入排序內容,賦值尋找目前元素能夠插入的位置
			while (j >= 0 && array[j]>temp){
				array[j + increment] = array[j];
				j -= increment;
			}
			array[j + increment] = temp;
		}
	}
}

shell排序(基於選擇排序)測試

相比於基於插入排序實現的shell排序,這個看起來循環多,實現的時候邏輯也不簡單于基於插入排序,ui

不知道是我寫的問題,仍是問題的自己就是這樣的,求指教spa

void shellSort2(int *array, int size, int d)
{
	//循環1,控制步長變化,直到步長爲1也執行後結束
	for (int increment = d; increment > 0; increment /= 2){
		//循環2,找出每組的開頭
		for (int k = 0; k < increment; k++){
			//循環3,屬於選擇排序範圍了,對上面提供的開頭的組內元素作選擇排序
			for (int i = k; i < size - 1; i += increment){
				int tempIndex = i;
				//循環4,屬於選擇排序
				for (int j = i + increment; j < size; j += increment){
					if (array[j] < array[tempIndex]){
						tempIndex = j;
					}
				}
				if (tempIndex != i){
					int temp = array[i];
					array[i] = array[tempIndex];
					array[tempIndex] = temp;
				}
			}
		}
	}
}

輔助的操做函數,包括 亂序函數,打印數組函數,交換元素值得函數code

//交換函數
void swap(int *a, int *b)
{
	int c = *a;
	*a = *b;
	*b = c;
}
//亂序函數,經過從後往前遍歷數組,使得當前索引的值與隨機一個比它索引小的元素交換
void shuffle(int *array, int size)
{
	srand((unsigned int)time(NULL));
	for (int i = size - 1; i > 0; i--){
		int index = rand() % i;
		swap(&array[i], &array[index]);
	}
}
//打印數組函數
void printArray(int *array, int size)
{
	for (int i = 0; i < size; i++){
		printf("%d\t",array[i]);
	}
}

主函數,負責測試各個排序函數排序

int main()
{
	//定義並初始化數組
	int array[MAX] = { 0 };
	for (int i = 0; i < MAX; i++){
		array[i] = i;
	}
	//對數組數據進行亂序
	shuffle(array, MAX);
	//打印亂序後的數組
	printArray(array, MAX);
	//測試各個排序的效果
	/*printf("\n快速排序後\n");
	quickSort(array, 0, MAX - 1);
	printArray(array, MAX);*/
	printf("\nshell排序後\n");
	shellSort(array, MAX, MAX / 2);
	printArray(array, MAX);
	return 0;
}
相關文章
相關標籤/搜索