排序:冒泡排序&快速排序

冒泡排序

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");
}


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页