基础排序

数据结构 P9 基础排序

1

简介

2

排序概念

假设含有n个记录的序列为{r1,r2,…,rn},其相应的关键字分别为{k1,k2,…,kn},需确定1,2,…,n的一种排列P1,p2,…pn,使其相应的关键字满足Kp1<Kp2<…<Kpn关系,即使得序列成为一个按关键字有序的序列,这样的操作就称为排序

稳定性

假设K1=Ki,且在排序前的序列中ri领先于r1则称所有的排序方法是稳定的,反之则为不稳定的

内排序与外排序

内排序
是在排序整个过程中,待排序的所有记录全部被放置在内容中

外排序
由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行

性能的影响
1.时间性能:排序是数据处理中经常执行的一种操作,往往属于系统的核心部分,因此排序算法的时间开销是衡量其好坏的最重要的标志

2.辅助空间:评价排序算法的另一个主要标准是执行算法所需要的辅助存储空间

3.算法的复杂性:注意这里指的是算法本身的复杂度,而不是指算法的时间复杂度

冒泡排序

3

冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止

冒泡排序的实现

还是以顺序表为例进行改进

编写sqlist.h
4

编写sqlist.c
5

void bbsort(sqlink L){
	int i,j,k;

	for(i = 0;i < L->last;i++){
		for(j = L->last-1;j >=i;j--){
			if(L->data[j] > L->data[j+1]){
				k = L->data[j];
				L->data[j] = L->data[j+1];
				L->data[j+1] = k; 
			}
		}
	}
}//冒泡排序

编写test.c
6

int sort_test(){
	//创建表
	sqlink L;
	L = sqlist_create();

	int a[]={12,53,9,27,163,53,47,38,82};
	int n =sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	sqlist_show(L);

	//查找算法
	int s,key;
	
	printf("请选择查找算法\n");
	printf("0.退出1.冒泡排序:");
	scanf("%d",&s);
	switch(s){
		case 0:break;
		case 1:bbsort(L);
			   sqlist_show(L);
			   break;
		case 2:break;
		default:printf("不在范围内请重新输入!\n");
	}

}

程序测试
7

算法运行分析
8

冒泡排序的优化

编写sqlist.h
9

编写sqlist.c
10

void bbsort(sqlink L){
	int i,j,k;

	for(i = 0;i < L->last;i++){
		for(j = L->last-1;j >=i;j--){
			if(L->data[j] > L->data[j+1]){
				k = L->data[j];
				L->data[j] = L->data[j+1];
				L->data[j+1] = k; 
			}
		}
	}
}//冒泡排序

编写test.c
11

int sort_test(){
	//创建表
	sqlink L;
	L = sqlist_create();

	int a[]={12,53,9,27,163,53,47,38,82};
	int n =sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	sqlist_show(L);

	//查找算法
	int s,key;
	
	printf("请选择查找算法\n");
	printf("0.退出1.冒泡排序2.冒泡排序优化:");
	scanf("%d",&s);
	switch(s){
		case 0:break;
		case 1:bbsort(L);
			   sqlist_show(L);
			   break;
		case 2:bbsort2(L);
			   sqlist_show(L);
			   break;
		default:printf("不在范围内请重新输入!\n");
	}

}

程序测试
12

简单选择排序

简单选择排序(Simple Selection Sort)就是通过n-1次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换之

编写sqlist.h
13

编写sqlist.c
14

void stsort(sqlink L){
	int i,j,k;
	int m;

	for(i = 0;i < L->last;i++){
		m = i;
		for(j = i+1;j <= L->last;j++){
			if(L->data[m] > L->data[j]){
				m = j;
			}			
		}
       if(i != m){
				k = L->data[m];
				L->data[m] = L->data[i];
				L->data[i] = k;
		}
	}
}//简单选择排序

编写test.c
15

int sort_test(){
	//创建表
	sqlink L;
	L = sqlist_create();

	int a[]={12,53,9,27,163,53,47,38,82};
	int n =sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	sqlist_show(L);

	//查找算法
	int s,key;
	
	printf("请选择查找算法\n");
	printf("0.退出1.冒泡排序2.冒泡排序优化3.简单选择排序:");
	scanf("%d",&s);
	switch(s){
		case 0:break;
		case 1:bbsort(L);
			   sqlist_show(L);
			   break;
		case 2:bbsort2(L);
			   sqlist_show(L);
			   break;
		case 3:stsort(L);
			   sqlist_show(L);
			   break;
		default:printf("不在范围内请重新输入!\n");
	}

}

程序测试
16

算法运行分析
17

直接选择排序

直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表

编写sqlist.h
18

编写sqlist.c
19

void insort(sqlink L){
	int i,j;
	for(i = 2;i <= L->last;i++){
		if(L->data[i] < L->data[i-1]){
			L->data[0] = L->data[i];
			for(j = i-1;L->data[j] > L->data[0];j--){
				L->data[j+1] = L->data[j];
			}
			L->data[j+1] = L->data[0];
		}
	}
}//直接插入排序算法

编写test.c
20

int sort_test(){
	//创建表
	sqlink L;
	L = sqlist_create();

	int a[]={0,12,53,9,27,163,53,47,38,82};
	int n =sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	sqlist_show(L);

	//查找算法
	int s,key;
	
	printf("请选择查找算法\n");
	printf("0.退出1.冒泡排序2.冒泡排序优化3.简单选择排序4.直接插入排序:");
	scanf("%d",&s);
	switch(s){
		case 0:break;
		case 1:bbsort(L);
			   sqlist_show(L);
			   break;
		case 2:bbsort2(L);
			   sqlist_show(L);
			   break;
		case 3:stsort(L);
			   sqlist_show(L);
			   break;
		case 4:insort(L);
			   sqlist_show(L);
			   break;
		default:printf("不在范围内请重新输入!\n");
	}

}

程序测试
21

算法运行分析
22

快速排序

快速排序(Quick Sort)的基本是想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的

编写sqlist.h
23

编写sqlist.c
24

void qksort(sqlink L,int low,int high){
	int pvt;

	if(low < high){
		pvt = partition(L,low,high);
		qksort(L,low,pvt-1);
		qksort(L,pvt+1,high);
	}
}//快速排序算法

int partition(sqlink L,int low,int high){
	int ptkey,k;
	ptkey = L->data[low];
	while(low < high){
		while(low<high && L->data[high] >= ptkey)high--;
		k = L->data[high];
		L->data[high] = L->data[low];
		L->data[low] = k;
		while(low < high && L->data[low] <= ptkey)low++;
		k = L->data[high];
		L->data[high] = L->data[low];
		L->data[low] = k;
	}
	return low;
}

编写test.c
25

int sort_test(){
	//创建表
	sqlink L;
	L = sqlist_create();

	int a[]={12,53,9,27,163,53,47,38,82};
	int n =sizeof(a)/sizeof(int);
	sqlist_arrayinsert(L,a,n,0);
	sqlist_show(L);

	//查找算法
	int s,key;
	
	printf("请选择查找算法\n");
	printf("0.退出1.冒泡排序2.冒泡排序优化3.简单选择排序4.直接插入排序5.快速排序:");
	scanf("%d",&s);
	switch(s){
		case 0:break;
		case 1:bbsort(L);
			   sqlist_show(L);
			   break;
		case 2:bbsort2(L);
			   sqlist_show(L);
			   break;
		case 3:stsort(L);
			   sqlist_show(L);
			   break;
		case 4:insort(L);
			   sqlist_show(L);
			   break;
		case 5:qksort(L,0,L->last);
			   sqlist_show(L);
			   break;
		default:printf("不在范围内请重新输入!\n");
	}

}

程序测试
26

算法运行分析
27

其他排序简介

28

陆续更新中…

更多内容

数据结构 P1简介与分类

数据结构 P2线性顺序表

数据结构 P3线性单链表

数据结构 P4 栈

数据结构 P5 队列

数据结构 P6 树和二叉树

数据结构 P7 基础查找

数据结构 P8 哈希表

数据结构 P9 基础排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CagePan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值