数据结构 P9 基础排序
简介
排序概念
假设含有n个记录的序列为{r1,r2,…,rn},其相应的关键字分别为{k1,k2,…,kn},需确定1,2,…,n的一种排列P1,p2,…pn,使其相应的关键字满足Kp1<Kp2<…<Kpn关系,即使得序列成为一个按关键字有序的序列,这样的操作就称为排序
稳定性
假设K1=Ki,且在排序前的序列中ri领先于r1则称所有的排序方法是稳定的,反之则为不稳定的
内排序与外排序
内排序
是在排序整个过程中,待排序的所有记录全部被放置在内容中
外排序
由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行
性能的影响
1.时间性能:排序是数据处理中经常执行的一种操作,往往属于系统的核心部分,因此排序算法的时间开销是衡量其好坏的最重要的标志
2.辅助空间:评价排序算法的另一个主要标准是执行算法所需要的辅助存储空间
3.算法的复杂性:注意这里指的是算法本身的复杂度,而不是指算法的时间复杂度
冒泡排序
冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止
冒泡排序的实现
还是以顺序表为例进行改进
编写sqlist.h
编写sqlist.c
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
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");
}
}
程序测试
算法运行分析
冒泡排序的优化
编写sqlist.h
编写sqlist.c
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
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");
}
}
程序测试
简单选择排序
简单选择排序(Simple Selection Sort)就是通过n-1次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换之
编写sqlist.h
编写sqlist.c
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
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");
}
}
程序测试
算法运行分析
直接选择排序
直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表
编写sqlist.h
编写sqlist.c
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
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");
}
}
程序测试
算法运行分析
快速排序
快速排序(Quick Sort)的基本是想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的
编写sqlist.h
编写sqlist.c
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
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");
}
}
程序测试
算法运行分析
其他排序简介
陆续更新中…