冒泡排序、快速排序、

博客介绍了三种排序算法。冒泡排序每次将最大数移到无序部分末尾,最好情况时间复杂度O(n),最坏O(n^2),空间复杂度O(1)且稳定;快速排序取基准值分割子序列;归并排序未详细展开。

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

冒泡排序

每次冒泡,把一个最大的数挤到无序部分的最后去。

如果遍历整个无序区间期间时,一次交换都没发生说明无序区间是有序的

void BubbleSort(int array[], int size) {
	for (int i = 0; i < size; i++) {
		int isSorted = 1;
		for (int j = 0; j < size - 1 - i; j++) {
			if (array[j] > array[j + 1]) {
				Swap(array, j, j + 1);
				isSorted = 0;
			}
	}
	if (isSorted == 1) {
		return;
	}
	}
}

最好情况:时间复杂度O(n)

最坏情况:O(n^2)

空间复杂度O(1)

冒泡排序是一种稳定的排序算法

快速排序

任取待排序元素序列中的某元素作为基准值,按照排序码将待排序集合分割成两子序列,左子序列所有元素均小于基准值,右子序列中所有元素均大于基准值,左右子序列重复该过程,直到所有元素都排列在相应的位置上。

按照基准值将区间分成左右子序列

void _QuickSort(int array[],int low,int high) {
	//区间长度为0,
	if (low > high) { return; }
	//区间长度为1,表示区间内数已经有序
	if (low == high) { return; }
	//找基准值,选最左边,基准值下边是low
	//遍历整个区间,小的放左,大的放右,返回基准值所在下标
	int pivotIdx = Partition_3(array, low, high);
	//分治算法,分别处理两个区间
	_QuickSort(array, low, pivotIdx-1);
	_QuickSort(array, pivotIdx + 1, high);
}

将区间按照基准值划分为左右两半部分的常见方式:

hoare版本

int Partition_1(int array[], int low, int high) {
	int begin = low;//begin从low开始
	int end = high;
	int pivot = array[low];
	while (begin < end) {
		//如果基准值放在左边,需要从右边开始走
		while (begin<end&&array[end] >= pivot) {
			end--;
		}
		if (begin == end) { return; }
		while (begin < end&&array[begin] <= pivot) {
			begin++;
		}
		Swap(array, begin, end);
	}
	Swap(array, low, begin);
	return begin;
}

挖坑法

int Partition_2(int array[], int low, int high) {//挖坑法
	int begin = low;//begin从low开始
	int end = high;
	int pivot = array[low];//坑的下标是begin
	while (begin < end) {
		//如果基准值放在左边,需要从右边开始走
		while (begin<end&&array[end] >= pivot) {
			end--;
		}

		array[begin] = array[end];
		while (begin < end&&array[begin] <= pivot) {
			begin++;
		}
		array[end] = array[begin];
	}
	array[begin] = pivot;
	return begin;
}

前后下标法

int Partition_3(int array[], int low, int high) {
	int d = low + 1;
	int i = low + 1;
	int pivot = array[low];
	while (i < high) {
		if (array[i] < pivot) {
			Swap(array, d, i);
			d++;
		} 
		i++;
	}
	Swap(array, d - 1, low);
	return d - 1;
}

归并排序

void Merge(int array[], int left, int mid, int right,int extra[]) {
	int i = left;
	int j = right;
	int k = 0;//extra的下标
	while (i < mid&&j < right) {
		if (array[i] < array[j]) {
			extra[k++] = array[i++];
		}
		else {
			extra[k++] = array[j++];
		}
	}
	while (i < mid) {
		extra[k++] = array[i++];
	}
	while (j < right) {
		extra[k++] = array[j++];
	}
	for (int x = left; x < right; x++) {
		array[x] = extra[x];
	}

}
void _MergeSort(int array[], int left, int right,int extra[]) {
	if (right == left + 1) { return; }
	if (right <= left) { return; }
	int mid = left + (right - left) / 2;
	_MergeSort(array,left,mid,extra);
	_MergeSort(array,mid,right,extra);
	Merge(array, left, mid, right,extra);
}
void MergeSort(int array[], int size) {
	int *extra = (int*)malloc(sizeof(int)*size);
	_MergeSort(array, 0, size,extra);
	free(extra);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值