排序入门简介

插入排序

ai前面的i-1个元素都是有序的,再插入第n个

直接插入排序:

直接把an和前面的n-1个依次比较

折半插入排序:

前面的n-1个先取中间的和an比较

希尔排序:

 交换排序:

冒泡排序:

每一次都把剩下的数里最大的放最后

代码:

#include <stdio.h>
#define MAXN 10000
int main()
{
	int i, index, j, n, temp, k;
	int a[MAXN];
	scanf("%d", &n);
	for(i = 0; i<n; i++){
		scanf("%d", &a[i]);
	}
	for(i = 1; i<n; i++){
		for(k = 0; k<n-1; k++){
			if(a[k]>a[k+1]){
				temp = a[k];
				a[k] = a[k+1];
				a[k+1] = temp;
			}
		}
	}
	for(i = 0; i<n; i++){
		if(i == 0){
			printf("%d", a[i]);
		}else{
			printf(" %d", a[i]);
		}
	}
	return 0;
}

快速排序:

基本思想: 
任取一个元素(如第一个)为中心;
所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表; 
对各子表重新选择中心元素并依此规则调整, 直到每个子表的元素只剩一个

选择排序:

简单选择排序:

 在待排序的数据中选出最大/小的元素放在其最终位置

写代码时应注意:

1.用序号而不是原数查找 2.元素的交换与各层嵌套的关系 3.每一个a[i]和a[index]比较

#include <stdio.h>
#define MAXN 10000
int main()
{
	int i, index, k, n, temp;
	int a[MAXN];
	scanf("%d", &n);
	for(i = 0; i<n; i++){
		scanf("%d", &a[i]);
	}
	for(k = 0; k<n-1; k++){
		index = k;
		for(i = k+1; i<n; i++){
			if(a[i]<a[index]){
				index = i;
			}
		}
		temp = a[index];a[index] = a[k];a[k] = temp;
	}
	for(i = 0; i<n; i++){
		if(i == 0){
			printf("%d", a[i]);
		}else{
			printf(" %d", a[i]);
		}
	}
	return 0;
}

堆排序:

若在输出堆顶的最小值(最大值)后,使得剩余n-1个元素的序列重又建成一个堆,则得到n个元素的次小值(次大值)……如此反复,便能得到一个有序序列,这个过程称之为堆排序。

建立堆:先初始无序地顺序存到二叉树里。从倒数第二层开始让每一个结点为根的子树都调整为堆
去掉堆顶之后再次调整成一个堆:以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进
行比较,并与其中小者进行交换

归并排序:

将两个有序子序列归并成一个(比较两个指针所指的元素,谁小就要谁,并且指针后移)。排序时,先两两分组,再把它们归并成一个

桶排序:

即分配+收集:先按个位排,在桶里的都是按顺序拿和放,再十位,再百位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值