【常考的排序算法汇总1:冒泡、快排(C源程序)】
交换排序
1.冒泡排序
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行的,直到没有再需要交换则结束,也就是说该数列已经排序完成。
1.1算法描述
[1].比较相邻的元素。如果第一个比第二个大,就交换它们两个;
[2].对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
[3].针对所有的元素重复以上的步骤,除了最后一个;
[4].重复步骤1~3,直到排序完成。
1.2举例理解
1.比较第1,2个数,若第一个数大于第二个数则交换位置,一直到最后一个数比较完毕,则第一轮结束
8 2 5 1 9 ——> 2 8 5 1 9 第一轮结果:2 5 1 8 9
2.接着从第一个数开始往后比,按第一个步骤的思想比较即可,最终结果为
1 2 5 8 9
1.3代码实现
#include <stdio.h>
#define N 5
int main()
{
int chuan[N];
int i,j,temp;
printf("请输入数字:\n");
for(i=0;i<N;i++)
{
scanf("%d",&chuan[i]);
}
printf("\n");
for(i=0;i<N-1;i++)
{
for(j=0;j<N-1-i;j++)
{
if(chuan[j]>chuan[j+1])
{
temp=chuan[j+1];
chuan[j+1]=chuan[j];
chuan[j]=temp;
}
}
}
for(i=0;i<N;i++)
{
printf("%d\n",chuan[i]);
}
return 0;
}
2.快速排序
快速排序是通过一趟排序将待排记录分隔成独立的两部分,一般来说按从小到大排序,其中右边部分记录的关键字均比左边部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
2.1算法描述 2.2举例理解
30 40 50 10 70 (此例起始 left 指向30, right 指向70;30为 base )
第一步:首先我们从数组的起始位置取出该数作为基准参照物,下例的30;
30 40 50 10 70
第二步:从数组的(right)向前找,一直找到比(base)小的数,如果找到则将(base)赋给(left)位置(也就是将10赋给30);
10 40 50 10 70
第三步:从数组的(left)位置向后找,一直找到比(base)大的数,
如果找到,将此数赋给(right)的位置(也就是40赋给10);
10,40,50,40,70
第四步:重复“第二,第三“步骤,直到left和right指针重合,
最后将(base)插入到40的位置,即完成一次排序;
10,20,50,40,60
第五步:此时20已经潜入到数组的内部,20的左侧一组数都比20小,20的右侧作为一组数都比20大,以20为切入点对左右两边数按照1~4步骤进行,最终快排大功告成。
2.3代码实现
#include <stdio.h>
#define N 6
void Quicksort(int s[],int g,int k)
{
int i,j,x;
if(g<k)
{
i=g;
j=k;
x=s[i];
while(i<j)
{
while(i<j&&s[j]>=x)
j--;
if(i<j)
s[i++]=s[j];
while(i<j&&s[i]<=x)
i++;
if(i<j)
s[j--]=s[i];
}
s[i]=x;
Quicksort(s,g,i-1);
Quicksort(s,i+1,k);
}
}
int main()
{
int i,a[N];
printf("请输入一串数字:\n");
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
Quicksort(a,0,N-1);
for(i=0;i<=N;i++)
{
printf("%4d\n",a[i]);
}
return 0;
}
(有错误麻烦指正,多多关照,做小白的第一天)