快速排序算法 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;
}

 

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