C++实现经典排序算法(超详细注释)

因为是在准备考研的复试上机,没有太多的时间整理出完善的知识点。因此,这里只给出每种排序算法的具体实现,如有不周到的地方,请见谅,谢谢!

一、冒泡排序算法

#include <iostream>
using namespace std;

//冒泡排序算法
void bubbleSort(int num[], int n) {
	for (int i = 0; i < n - 1; i++) {		//外层循环,只需要比较n-1次
		bool flag = false;			//标志位,判断本轮循环是否交换过
		for (int j = 0; j < n - i - 1; j++) {	//两两进行比较
			if (num[j] > num[j + 1]) {		//如果前一个元素大于后面一个元素
				flag = true;				//标志位修改为true
				int temp = num[j + 1];		//交换两个元素
				num[j + 1] = num[j];
				num[j] = temp;
			}
		}
		if (flag == false) {			//如果本来没有交换过,就表示数列已经有序
			break;						//直接结束循环
		}
	}
}

int main() {
	int num[] = { 9,8,7,6,5,4,3,2,1,0 };		//定义初始状态的数组

	bubbleSort(num, 10);			//调用冒泡排序

	cout << "排序后的数组:";			//打印排序后的数组
	for (int i = 0; i < 10; i++) {
		cout << num[i]<<" ";
	}
}

二、双向冒泡排序算法

这个是对冒泡排序的一些优化,但是时间复杂度上面没有改变(目标院校的往年上机题中出现过,所以这里也记录一下)

#include <iostream>
using namespace std;

void bidBubbleSort(int num[], int n) {
	for (int i = 0; i < n-1; i++) {			//外层循环,只需要n-1次
		bool flag = false;			//标志位,用来记录本轮排序是否进行了交换
		for (int j = 0; j < n - i - 1; j++) {		//从左至右进行排序
			if (num[j] > num[j + 1]) {				//如果前一个大于后一个
				flag = true;					//修改标志位
				int temp = num[j];				//进行交换
				num[j] = num[j + 1];
				num[j + 1] = temp;
			}
		}
		for (int j = n - i - 2; j > 0; j--) {	//从右至左进行排序
			if (num[j] < num[j - 1]) {			//如果后一个小于前一个
				flag = true;					//修改标志位
				int temp = num[j - 1];			//进行交换
				num[j - 1] = num[j];
				num[j] = temp;
			}
		}
		if (flag == false) {			//如果本轮没有修改过,表示数列已经有序
			break;						//直接结束循环
		}
	}
}

int main() {
	int num[] = { 9,8,7,6,5,4,3,2,1,0 };		//定义初始状态的数组

	bidBubbleSort(num, 10);			//调用双向冒泡排序

	cout << "排序后的数组:";			//打印排序后的数组
	for (int i = 0; i < 10; i++) {
		cout << num[i]<<" ";
	}
}

三、选择排序

#include <iostream>
using namespace std;

//选择排序
void selectSort(int num[], int n) {
	for (int i = 0; i < n - 1; i++) {		//外层循环,只需要n-1次
		int min = i;				//初始化min,标记本轮循环中最小元素位置
		for (int j = i + 1; j < n; j++) {	//内层循环,从i+1位置开始
			if (num[j] < num[min]) {		//如果当前位置元素小于num[min]
				min = j;			//修改min的值	
			}
		}
		if (min != i) {				//如果min不是最初的值
			int temp = num[i];		//进行交换
			num[i] = num[min];
			num[min] = temp;
		}
	}
}

int main() {
	int num[] = { 9,8,7,6,5,4,3,2,1,0 };		//定义初始状态的数组

	selectSort(num, 10);			//调用选择排序

	cout << "排序后的数组:";			//打印排序后的数组
	for (int i = 0; i < 10; i++) {
		cout << num[i]<<" ";
	}
}

四、插入排序

#include <iostream>
using namespace std;
//选择排序
void insertSort(int num[],int n){
	for (int i = 1; i < n; i++) {			//外层循环,从第二个元素开始
		int temp = num[i];					//记录下来第i个元素
		int j;
		for (j = i - 1; j >= 0; j--) {		//从第i-1个元素开始向前
			if (num[j] > temp) {			//如果第j个元素大于temp
				num[j + 1] = num[j];		//则j位置元素向后移动到j+1
			}
			else {
				break;					//找到temp要插入位置,直接结束里层循环
			}
		}
		num[j + 1] = temp;			//temp插入指定位置
	}
}

int main() {
	int num[] = { 9,8,7,6,5,4,3,2,1,0 };		//定义初始状态的数组

	insertSort(num, 10);			//调用选择排序

	cout << "排序后的数组:";			//打印排序后的数组
	for (int i = 0; i < 10; i++) {
		cout << num[i]<<" ";
	}
}

五、希尔排序

#include <iostream>
using namespace std;

//希尔排序
void shellSort(int num[], int n) {
	for (int gap = n / 2; gap > 0; gap /= 2 ) {		//设定每轮循环的间隙gap
		for (int i = gap; i < n; i++) {			//从第gap开始向后比较
			int temp = num[i];					//记录下第i个元素的值
			int j;
			for (j = i - gap; j >= 0; j -= gap) {	//进行跳跃式插入排序
				if (num[j] > temp) {				//如果num[j]大于temp
					num[j + gap] = num[j];			//则num[j]向后移动gap个位置
				}
				else {								//否则已经找到temp要插入的位置
					//注意:这个break必须有,保证查找到temp要插入的位置时立马跳出循环,不会继续执行
					break;							//直接结束内层循环
				}
			}
			num[j + gap] = temp;					//将temp插入到指定位置
		}
	}
}



int main() {
	int num[] = { 9,8,7,6,5,4,3,2,1,0 };		//定义初始状态的数组

	shellSort(num, 10);			//调用希尔排序

	cout << "排序后的数组:";			//打印排序后的数组
	for (int i = 0; i < 10; i++) {
		cout << num[i]<<" ";
	}
}

六、归并排序

#include <iostream>
using namespace std;



void Merge(int arr[], int low, int mid, int high) {
	//i指向第一有序区的第一个元素,j指向第二有序区的第一个元素
	int i = low, j = mid + 1, k = 0;
	int* temp = new int[high - low + 1];	//创建一个临时数组来作为中转
	while (i <= mid && j <= high) {			//边界条件
		if (arr[i] <= arr[j]) {				//如果第一有序区的元素小于第二有序区
			temp[k++] = arr[i++];			//将第一有序区元素放入中转数组
		}
		else {
			temp[k++] = arr[j++];			//否则,第二有序区元素放入中转数组
		}
	}
	while (i <= mid) {
		temp[k++] = arr[i++];			   //将剩余元素加入中转数组
	}
	while (j <= high) {
		temp[k++] = arr[j++];			   //将剩余元素加入中转数组
	}
	for (int i = low, k = 0; i <= high; i++, k++) {		
		arr[i] = temp[k];					//从中转数组中转移回原数组
	}
	delete[]temp;							//释放空间
}

void MergeSort(int arr[], int low, int high) {
	if (low >= high) {
		return;						//如果只有一个元素,直接返回
	}
	int mid = (low + high) / 2;		//取中点
	MergeSort(arr, low, mid);		//对第一个区域进行排序
	MergeSort(arr, mid + 1, high);	//对第二个区域进行排序
	Merge(arr, low, mid, high);		//合并两个区域
}

int main() {
	int num[] = { 9,8,2,7,4,5,3,6,1,0 };		//定义初始状态的数组

	MergeSort(num, 0,9);			//调用归并排序

	cout << "排序后的数组:";			//打印排序后的数组
	for (int i = 0; i < 10; i++) {
		cout << num[i]<<" ";
	}
}

七、快速排序

#include <iostream>
using namespace std;

void quickSort(int arr[],int left, int right)
{
	if (left >= right)			//如果只剩下一个元素
		return;					//直接返回
	int i, j, base, temp;
	i = left, j = right;		//初始化 i=左端点 j=右端点
	base = arr[left];			//base用来存放基准值
	while (i < j)				//边界条件
	{
		while (arr[j] >= base && i < j)		//当右边元素大于基准值,则不动
			j--;
		while (arr[i] <= base && i < j)		//当左边元素小于基准值,则不动
			i++;
		if (i < j)							
		{
			temp = arr[i];					//交换左右
			arr[i] = arr[j];
			arr[j] = temp;
		}
	}

	arr[left] = arr[i];						
	arr[i] = base;							//将基准值存放到i位置
	quickSort(arr, left, i - 1);			//递归左边
	quickSort(arr, i + 1, right);			//递归右边
}


int main() {
	int num[] = { 9,8,2,7,4,5,3,6,1,0 };		//定义初始状态的数组

	quickSort(num, 0, 9);			//调用快速排序

	cout << "排序后的数组:";			//打印排序后的数组
	for (int i = 0; i < 10; i++) {
		cout << num[i]<<" ";
	}
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值