排序算法

本文介绍了两种高效的排序算法——堆排序与快速排序。堆排序的时间复杂度为O(n*lgn),具有空间原址性;快速排序的平均时间复杂度同样为O(n*lgn),最坏情况下为O(n*n),并且能进行原址排序。文章提供了这两种排序算法的具体实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆排序:

与归并排序一样,但不同于插入排序的是,堆排序的时间复杂度为O(n*lgn);

而与插入排序一样,不同于归并排序的是,堆排序具有空间原址性。

因此,堆排序集合了归并排序与插入排序的优点。

算法导论上的代码:

HeapSort.h

#define PARENT(i)        (i-1)/2
#define LEFTCHILD(i)      i*2+1
#define RIGHTCHILD(i)    (i+1)*2

void max_heapify(int* arr, int i);
void build_max_heap(int* arr, int num);
void heapSort(int* arr, int heapSize);

void max_heapify(int* arr, int i, int heapSize)
{
	if (i > (heapSize / 2 - 1)) return;
	int largestIndex = i;
	if (arr[i] < arr[LEFTCHILD(i)])
		largestIndex = LEFTCHILD(i);
	if (RIGHTCHILD(i) <= heapSize-1 && arr[largestIndex] < arr[RIGHTCHILD(i)])
		largestIndex = RIGHTCHILD(i);
	if (largestIndex != i)                                  //若largestIndex == i,说明以i为根的子树已经满足最大堆得性质了。
	{
		int temp = arr[largestIndex];
		arr[largestIndex] = arr[i];
		arr[i] = temp;
		max_heapify(arr, largestIndex, heapSize);           //此时,以largestIndex为根节点的子树未必满足最大堆性质,所以递归调用。
	}
}

void build_max_heap(int* arr, int heapSize)
{
	for (int i = (heapSize / 2 - 1); i >= 0; --i)
	{
		max_heapify(arr, i, heapSize);
	}
}

void heapSort(int* arr, int heapSize)
{
	build_max_heap(arr, heapSize);
	for (int i = 1; i < heapSize; ++i)
	{		
		int temp = arr[0];
		arr[0] = arr[heapSize - i];
		arr[heapSize - i] = temp;
		max_heapify(arr, 0, heapSize-i);
	}
}

快速排序:

一种最坏情况时间复杂度为O(n*n)的排序算法。但是快排通常是实际排序应用中最好的选择,因为它的平均性能好:期望时间复杂度为O(n*lgn),且隐含的常数因子非常小,同时也能进行原址排序。

QuickSort.h

int partition(int* arr, int p, int r); 
int quickSort(int* arr, int p, int r); 


int partition(int* arr, int p, int r)
{
	int cmp = arr[r];
	int j = p - 1;
	for (int i = p; i < r; ++i)
	{
		if (arr[i] < cmp)
		{
			j++;
			if (i != j)
			{
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}
	arr[r] = arr[j + 1];
	arr[j + 1] = cmp;
	return j + 1;
}


int quickSort(int* arr, int p, int r)
{
	if (p < r)
	{
		int q = partition(arr, p, r);
		quickSort(arr, p, q - 1);
		quickSort(arr, q + 1, r);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值