一、排序算法概念
假设含有n个记录的序列为{r1,r2,……,rn},其相应的关键字分别为{K1,K2,……,Kn},需确定1,2,3,……,n的一种排序p1,p2,p3,……,pn;使其相应的关键字满足kp1<=kp2<=kp3<=kp4<=……<=kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序得序列{rp1,rp2,……,rpn},这样的操作就成为排序。
在排序问题中,通常将数据元素称为记录。
——显然我们输入得是一个记录集合,排序后输出的也是一个记录的集合。
——所以我们可以将排序看成是线性表的一种操作。
排序的依据是关键字之间的大小关系,那么对同一记录集合,针对不同的关键字进行排序,可以得到不同序列。
排序的稳定性
假设Ki = Kj(1<=i<=n,1<=j<=n,i != j),且在排序前的序列中ri领先于rj(即i
——如果排序后ri仍然领先于rj,则称所用的排序方法是稳定的;
——反之,若可能使得排序后的序列中rj领先ri,则称所用的排序方法是不稳定的。
影响排序算法性能的几个要素
——时间性能
——辅助空间
——算法的复杂性
二、冒泡排序
冒泡排序的基本思想:两两相邻记录的关键字,如果反序则交换,知道没有反序为止!
#include
#define t 10
void BobbleSort(int k[],int n)
{
int i,j,temp;
for(i=0;ik[j])
{
temp = k[j];
k[j] = k[i];
k[i] = temp;
}
}
}
}
int main()
{
int i,a[t] = {4,2,5,10,39,1,3,65,8,6};
BobbleSort(a,t);
printf("排序后的结果:\n");
for(i=0;i
冒泡排序的要点
1、两两注意是相邻的两个元素的意思。
2、如果有n个元素需要比较n-1次,每一轮减少1次比较。
3、既然叫冒泡排序,那就是从下往上两两比较,所以看上去就跟泡泡往上冒一样。
冒泡排序最终版
#include
#define t 10
int count1=0;
int count2=0;
void BobbleSort(int k[],int n)
{
int i,j,temp;
int falg=1;
for(i=0;ii;j--)
{
count1++;
falg=0;
if(k[j-1]>k[j])
{
count2++;
temp = k[j-1];
k[j-1] = k[j];
k[j] = temp;
falg = 1;
}
}
}
}
int main()
{
int i,a[t] = {4,2,5,10,39,1,3,65,99,8};
BobbleSort(a,t);
printf("总共进行了%d次比较,进行了%d次移动。",count1,count2);
printf("排序后的结果:\n");
for(i=0;i
三、直接选择排序
#include
void SelectSort(int k[],int n)
{
int i,j,min,temp;
for(i=0;i
四、直接插入排序
直接插入排序算法(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。
#include
void InsertSort(int k[],int n)
{
int i,j,temp;
for(i=1;itemp;j--)
{
k[j+1] = k[j];
}
k[j+1] = temp;
}
}
}
int main()
{
int i,a[10]= {5,2,6,0,3,9,1,7,4,8};
InsertSort(a,10);
printf("排序后的结果是:\n");
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);
}
printf("\n\n");
return 0;
}