快速排序

 · 2022-8-18 · 次阅读


快速排序

根据王道书上的代码,对快速排序做整理。

快速排序的思想是:

  • 使用双指针法,将第一个元素放在表中合适的位置,使得这个位置左面的元素都小于这个元素,右面的元素都大于等于这个元素。
  • 递归的处理这个元素分割而成的两个子表,使得有序。

在编写相关的额代码的时候,一定一定一定要注意函数的退出条件和循环的退出条件

快速排序调用的深度和对应二叉树的深度相同。

快速排序的最好时间复杂度是O(log2n),最坏时间复杂度是O(n^2)

快速排序的最好空间复杂度是O(log2n),最坏空间复杂度是O(n)

# include <stdio.h>
# include <stdlib.h>
# include <time.h>
 
# define LENGTH 10
int i = 0;

void CreateList(int * data, int len)
{
	int i = 0;
	srand(time(NULL));
	for (i=0; i<len; i++) {
		data[i] = rand() % 100;
	}
	return;
}
 
void PrintList(int * data, int len)
{
	int i = 0;
	for (i=0; i<len; i++) {
		printf("%d ", data[i]);
	}
	printf("\n");
	return;
}

// 将首元素放在合适的位置,返回放置的位置
int Partition(int * data, int low, int high)
{
	int middle = data[low];								// 提前将元素保存出来,防止覆盖
	while (low < high) {
		while(low < high && data[high] >= middle) {		// 注意每次移动指针都需要判断指针的关系
			high--;
		}
		data[low] = data[high];
		while (low < high && data[low] < middle) {
			low++;
		}
		data[high] = data[low];
	}
	data[low] = middle;
	return low;
}

// 快速排序主函数
void QuickSort(int * data, int low, int high)
{
	if (low < high) {
		int middle = Partition(data, low, high);
		printf("%2d th sort: ", ++i);
		PrintList(data, LENGTH);
		QuickSort(data, low, middle - 1);				// 左子序列
		QuickSort(data, middle + 1, high);				// 右子序列
	}
	return;
}
 
int main(void)
{
	int * data = (int *)malloc(sizeof(int) * LENGTH);
	CreateList(data, LENGTH);
 
	printf("Before sort: ");
	PrintList(data, LENGTH);
	QuickSort(data, 0, LENGTH - 1);
	printf("After sort: ");
	PrintList(data, LENGTH);
	
	return 0;
}

image.png