C++ 排序算法

选择排序

在每一次的遍历中找到当前最小/最大的值,记录当前值的下标,然后与第i个元素交换。
比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换…第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。

void SelectSort(int array[], int len) {
	for (int i = 0; i < len; i++) {
		int index = i;
		for (int j = i + 1; j < len; j++) {
			if (array[index] > array[j]) {
				index = j;
			}
		}
		int temp = array[i];
		array[i] = array[index];
		array[index] = temp;
	}
	printf("SelectSort: \n");
	PrintList(array, len);
}

插入算法

判断第i个元素的位置时,从i-1到0遍历对比元素大小,递增数组则找到小于arr[i]的位置index,将index+1到i-1都向后移动(在查找的同时移动),交换i和index+1的数据。

void InsertSort(int a[], int len) {
	for (int i = 1; i < len; i++) {
		int key = a[i];
		int j = i - 1;
		for (; j >= 0 && a[j] > key; j--) {
			a[j + 1] = a[j];
		}
		a[j + 1] = key;
	}
	printf("InsertSort: \n");
	PrintList(a, len);
}

冒泡排序

临近的两个数据对比大小排序,第一层循环为N-1次,每次将当前最大或最小的元素交换到末尾,一共需要N-1次。第二层循环为N-i-1次,两两判断。

void BubbleSort(int array[], int len) {
	for (int i = 0; i < len - 1; i++) {
		for (int j = 1; j < len - i; j++) {
			if (array[j - 1] < array[j]) {
				int temp = array[j - 1];
				array[j - 1] = array[j];
				array[j] = temp;
			}
		}
	}
	printf("BubbleSort: \n");
	PrintList(array, len);
}

快速排序

需要排序的序列list[],左标left,右标right,基准数temp = list[left],左标签i初始值为left,右标签j初始值为right。
需要将这个序列中所有比基准数大的数放在基准数的右边,比基准数小的数放在左边
如果right<=left,则表示不需要排序了。
j–的过程中要保证list[j]>temp,且j>i;i++的过程中要保证list[i]<temp,且j>i;
j停下的地方为从右到左第一个小于基准数的位置,i停下的地方为从左到右第一个大于基准数的位置,若i<j,则替换两个位置的元素。继续遍历直到i>=j。
然后再把基准数和i位置的元素交换。

void QuickSort(int l,int r) {
	if (l >= r)
		return;
	int temp = list[l];
	int i = l, j = r;
	while (i != j) {
		while (list[j] >= temp&&i < j)
			j--;
		while (list[i] <= temp&&j > i)
			i++;
		if (i < j) {
			int key = list[i];
			list[i] = list[j];
			list[j] = key;
		}
	}
	list[l] = list[i];
	list[i] = temp;
	QuickSort(l, i - 1);
	QuickSort(i + 1, r);
}

归并排序

……

性能对比

图源博客
在这里插入图片描述

其他

  • 数组长度计算:
int length = (int)sizeof(list) / sizeof(list[0]);
  • 不使用多余空间交换数据:异或^
void Exchange(int i, int j) {
	list[i] = list[i] ^ list[j];
	list[j] = list[i] ^ list[j];
	list[i] = list[i] ^ list[j];
}
  • 判断数组是否相等:
bool isEqual(int first[], int second[]) {
	if (first == nullptr&&second == nullptr)
		return true;
	if ((first == nullptr&&second != nullptr) || (first != nullptr&&second == nullptr))
		return false;
	if (LengthList(first) != LengthList(second))
		return false;
	for (int i = 0; i < LengthList(first); i++) {
		if (first[i] != second[i])
			return false;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值