冒泡排序
1、基本思想:将第一个记录的关键字与第二个记录的关键字比较,若为逆序,则将两个记录交换,再向后比较。关键字小的漂浮,关键字大的下沉。
2、稳定性:算法稳定。
3、时间复杂度:O(n²),空间复杂度:O(1)
4、代码实现:
#include<stdio.h>
#define N 5 /*数组长度上限*/
int main()
{
int A[N],i,j,temp;
printf("请输入五个数字:\n");
for(i=0;i<N;i++) /*给数组赋值*/
scanf("%d",& A[i]);
for(i=1;i<N;i++)/*外层循环控制比较的轮数*/
for(j=0;j<N-i;j++)/*内层循环控制每一轮比较的次数*/
if(A[j]>A[j+1])/*前后两组数比较交换*/
{
temp=A[j];
A[j]=A[j+1];
A[j+1]=temp;
}
printf("冒泡排序结果为:\n");
for(i=0;i<N;i++)
printf("%d\t",A[i]);
return 0;
}
快速排序
1、基本思想:①从数列中取一个数作为基准数(枢轴)。②比基准数大的放右边,小于等于的放左边。③重复第二步至各区间只有一个数,达到整个序列有序。
2、具体操作:假设枢轴关键字为pivotkey,附设两个指针low和high,初值分别为s和t。将枢轴记录移至临时变量,若high≥pivotkey,则high减1(符合划分区间,进一步缩小范围),否则将high所指关键字移至low所指位置(将不符合的关键字移至正确区间)。当high所指不符合要求后检测low所指记录,若low≤pivotkey,则low增1,否则将low所指关键字移至high所指位置。重复进行两个方向的检测,直至high与low两个指针指向同一位置重合为止。
3、枢轴元素的选取:通常选取第一个元素。可选:首元素、尾元素、中值元素(首元素、尾元素、中间位置元素三者中中间大小的那个元素)、随机元素。
4、稳定性:不稳定
5、时间复杂度:平均O(n lb n)
6、代码实现:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int array[MAX];
void FastSort(int n,int min,int max)//快速排序
{
int i=0;
int head,tail;
int t;
if(min<max)//从表的两端交替地向中间扫描
{
head=min;
tail=max;
t=array[head];//记录枢轴的位置
while(head!=tail)
{
while(head<tail&&array[tail]>=t)//从右向左扫描
tail--;
if(head<tail)
array[head++]=array[tail];//交换结点
while(head<tail&&array[head]<=t)//从左到右扫描
head++;
if(head<tail)
array[tail--]=array[head];
}
array[head]=t;
FastSort(n,min,head-1);
FastSort(n,tail+1,max);
}
}
void main()
{
int i,count=0;
char flag;
printf("请输入要排序的数字\n");
for(i=0;flag!='\n';i++)
{
scanf("%d",&array[i]);
flag=getchar();
count++;
}
FastSort(count,0,count-1);
printf("快速排序结果为:\n");
i=0;
while(i<count)
{printf("%d ",array[i]);
i++;}
printf("\n");
}