快速排序算法 c代碼+清晰註釋

版權聲明:轉載需標明該文鏈接。 https://blog.csdn.net/zaibeijixing/article/details/90035587

快速排序算法目前來說是性能高內存少的排序算法了。

  • 原理是:依次拿基準值(可取起始值)比較尾、首,目標是將一段數字以基準值分爲左小右大兩段,各段再遞歸比較直到排好。
  • 要把握的核心是:每次比較交換後後,需排序小數組的首尾標號更新。

以下代碼參考了 https://www.cnblogs.com/qsyll0916/p/7496886.html 並修改,加以詳細扼要註釋(精華都在註釋和變量名中),回顧快速排序的學習歷程,自認爲比絕大部分長篇大論及圖片動畫來的直接清晰。

代碼如下:

#include <stdio.h>


/*
快速排序算法學習
原理:依次拿基準值(可取起始值)比較尾、首,目標是將一段數字以基準值分爲左小右大兩段,各段再遞歸比較直到排好。
參考 https://www.cnblogs.com/qsyll0916/p/7496886.html 並修改、加詳細扼要註釋。
*/

void print_array(int arr[], int n)  // 打印數組
{
	for (int i = 0; i < n; i++)
		printf("%5d", arr[i]);
	printf("\n");
}

void swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

/**********************************
fuction:快速排序函數
int arr[]:初始數組
int index_begin:初始數組的起始下標
int index_end:初始數組的末尾下標
***********************************/
void quickSort_s(int arr[], int index_begin, int index_end)
{
	//	新一輪遞歸用
	int temp_begin = index_begin;  // 詳見第二輪解釋
	int temp_end = index_end;
	if (temp_begin >= temp_end)  // 如果新一輪開始時,排序組的兩端已經在同一個點,就不需再排序了
		return;
		
	//	第一輪排序
	int baseValue = arr[index_begin];  // 本代碼中這個值只能是起始值,不能換
	while (index_begin < index_end)
	{
		while (index_begin < index_end && baseValue < arr[index_end])  // 末端起,若尾大,不交換,尾部左移;尾小不移,開始交換
			index_end--;
		if (index_begin < index_end)
		{
			swap(&arr[index_begin], &arr[index_end]);
			print_array(arr, 8);
			index_begin++;  // 換後右移
		}


		while (index_begin < index_end  && baseValue > arr[index_begin])  // 若首部小,不交換,首部右移;首大不移,開始交換
			index_begin++;
		if (index_begin < index_end)
		{
			swap(&arr[index_begin], &arr[index_end]);
			print_array(arr, 8);
			index_end--;  // 換後左移
		}

		//printf("beginI= %d	endI= %d\n", index_begin, index_end);
	}


	//	第二輪排序,調用第一輪的步驟-遞歸
	int mid_index = index_begin;  // 第二輪兩段分界點
	//	第一輪結束後的index_begin和index_end都已經轉移到分界點這個位置,因此第二輪不能直接使用這兩個參數,
	//	可以在前一輪開始前記錄兩端位置,新一輪開始時再用做兩端。
	quickSort_s(arr, temp_begin, mid_index - 1);
	quickSort_s(arr, mid_index + 1, temp_end);
}


int main()
{
	int myArr[] = { 5,2,7,9,0,8,1,4 };
	int arrLength = sizeof(myArr) / sizeof(int);
	print_array(myArr, arrLength);

	quickSort_s(myArr, 0, arrLength - 1);
	printf("\nDone:\n");
	print_array(myArr, arrLength);

	getchar();
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章