(上)简单排序之选择排序,冒泡排序,插入排序

简单排序:选择排序,冒泡排序,插入排序

1选择排序:从数组中每次挑选一个最小值,与放在设置好的位置,时间复杂度上下界都是n^2

代码实现: PS.没有给出main函数,只给出了排序函数的算法

void paixv(int arr[], int n) {
	int i, j, min , k = 0;
	
	for (i = 0; i < n; i++) {//外循环控制轮数
		min = i;
		for (j = i + 1; j < n; j++) {//内循环进行比较
			if (arr[j] < arr[min]) {
				min = j;
			}
		}
		int tmp = arr[i];
		arr[i] = arr[min];
		arr[min] = tmp;
	}
		
		
	
	//输出函数
	for (i = 0; i < n; i++) {
		cout << arr[i];
		if (i < n - 1) {
			printf(" "); 
		}
	}
}

选择排序耗时(PTA 排序题OJ
选择排序耗时

2冒泡排序:对数组中相邻的两元素进行比较,如果左大于右则交换位置.时间复杂度下界n,上界n^2
void paixv(int arr[], int n) {
	int p = n, i, j;
	int x;
	int flag;
	for (i = p; i > 0; i--) {
		flag = 0;//用来判断当前排序是否已经不需要再变动   flag=1时说明数组进行了一次变动  等于0说明没有执行交换,数组已经有序,此时可以退出循环 
		for (j = 0; j < i-1; j++) {//从第1个开始,也就是数组第0个 结束是i-1 即数组最后一项
			if (arr[j] > arr[j + 1]) {
				x = arr[j+1];
				arr[j + 1] = arr[j];
				arr[j] = x;
				flag = 1;
			}
		}
		//当以上的if判断一次都没被调用过,证明序列已经有序,可以直接跳出循环
		if (flag == 0) {
			break;
		}
	}
	for (i = 0; i < n; i++) {
		cout << arr[i] ;
		if (i < n-1)
		{
			printf(" ");
		}
	}

}

冒泡排序耗时:
冒泡耗时

3插入排序:从待排序列中抽一个数放到有序序列中,通过每次比较大小从而插入数生成一个新的有序序列.时间复杂度下界n,上界n^2

对于基本有序的序列来说插排的速度比较快

void paixv(int arr[], int n) {
	int i, j, temp;
	for (i = 1; i < n; i++) {//从数组第一项开始
		temp = arr[i];
		for (j = i; j > 0  && arr[j - 1] > temp; j--) {//从头开始比较,如果前者大于后者,互换			
			arr[j] = arr[j - 1];				

		}
		arr[j] = temp;
	}

	for (i = 0; i < n; i++) {
		cout << arr[i];
		if (i < n - 1) {
			printf(" ");
		}
	}
}

插排耗时:(其中倒数第二项是相对有序的序列,可以看到耗时比上面的短很多插入排序

以上三种仅以交换相邻两元素的排序算法有插排和冒泡,平均时间复杂度下界都是n^2,主要优点是简单,但是当数据量大并且相对无序的时候,排序的时间往往很久.

最坏情况下,选择排序的耗时比冒泡排序的要短,因为冒泡每一次比较为真后需要相邻两数交换,选择排序每次查找只会找到最小的数,然后放入预先设置好
的位置中.而插入排序对于基本有序的数据而言非常的快,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值