简单的排序方法


有关选择排序法和冒泡排序法的对比(通过pta例题分析)

实验8-1-4 使用函数的选择法排序 (25分)
本题要求实现一个用选择法对整数数组进行简单排序的函数。

函数接口定义:

void sort( int a[], int n );

其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

void sort( int a[], int n );

int main() {
int i, n;
int a[MAXN];

scanf("%d", &n);
for( i=0; i<n; i++ )
    scanf("%d", &a[i]);

sort(a, n);

printf("After sorted the array is:");
for( i = 0; i < n; i++ )
    printf(" %d", a[i]);
printf("\n");

return 0; }

/* 你的代码将被嵌在这里 */

输入样例:

4
5 1 7 6

输出样例:

After sorted the array is: 1 5 6 7

1.选择排序法

void sort( int a[], int n )
{
    int i,j,temp;
    for(i=0;i<n;i++)
  {
    for(j=i+1;j<n;j++){
      if(a[i]>a[j]){
      temp=a[i];
      a[i]=a[j];
      a[j]=temp;
      }
    }
  }
}

结果展示
在这里插入图片描述

排序过程描述

最初时:5 1 7 6
第一次:1 5 7 6
第二次:1 5 7 6
第三次:1 5 6 7
最终时:1 5 6 7

思路分析:
按照数组索引增加按照要求的大小顺序依次选择最小的数交换后储存进数组,对于数组元素,是无序的选择而是有序的排列。

2.冒泡法排序

void sort( int a[], int n )
{
    int i,j,temp;
    j=n;
    while(j>=0){
    for(i=0;i+1<j;i++){
      if(a[i]>a[i+1]){
        temp=a[i];
        a[i]=a[i+1];
        a[i+1]=temp;
      }
    }
    i=0;
    j--;
    }
}

结果展示
在这里插入图片描述
排序过程描述

最初时:5 1 7 6
第一次:1 5 6 7
第二次:1 5 6 7
第三次:1 5 6 7
最终时:1 5 6 7

思路分析
冒泡法排序就可以想象成小鱼吐泡泡一样,将我们需要的最大的数通过相邻数组元素比较交换逐步“浮”出来,每次浮出最大数后比较剩余的数(j–),从头开始(i=0),依次“浮”出最大的数。

3.桶排序

输入几组数据,对数据进行一个一个的收集,此排序需要大量的储存空间
输入:

5
9 4 7 2 5

输出:

2 4 5 7 9

如果有重复的也可进行选择性输出
代码实现:

#include<stdio.h>
int a[10],i;
int main()
{
int n,t;
scanf("%d",&n);
while(n--){
scanf("%d",&t);
a[t]++;
}
for(i=0;i<10;i++){
if(a[i]!=0){
while(a[i]--)
printf("%d",i);
	}
}
return 0;
} 

过程展示:
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
开始: 0 0 0 0 0 0 0 0 0 0
第一个:0 0 0 0 0 0 0 0 0 1
第二个:0 0 0 0 1 0 0 0 0 1
第三个:0 0 0 0 1 0 0 1 0 1
第四个:0 0 1 0 1 0 0 1 0 1
第五个:0 0 0 0 1 1 0 0 0 1
再按从小到大遍历输出

4.快速排序

#include<stdio.h>
int a[1001];
void quicksort(int left,int right)
{
	int i,j,t,temp;
	if(left>right)
	return;
	temp=a[left];
	i=left;
	j=right;
	while(i!=j)
	{
		while(a[j]>=temp&&i<j)
		j--;
		while(a[i]<=temp&&i<j)
		i++;
		if(i<j)
		{
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		}
	}
	a[left]=a[i];
	a[i]=temp;
	quicksort(left,i-1);
	quicksort(i+1,right);
	return;
}
int main()
{
	int n;
	scanf("%d",&n);
	int i=0;
	while(i<n)
	{
		scanf("%d",&a[i]);
		i++;
	}
	quicksort(0,n-1);
	for(i=0;i<n;i++)
	printf("%d",a[i]);
	return 0;
 } 

输入:

10
6 1 2 7 9 3 4 5 10 8

输出:

1 2 3 4 5 6 7 8 9 10

数组内的变化过程:

6 1 2 5 9 3 4 7 10 8
6 1 2 5 4 3 9 7 10 8
3 1 2 5 4 6 9 7 10 8
分成6左右两边进行排序
2 1 3 5 4 6 9 7 8 10
1 2 3 5 4 6 8 7 9 10
1 2 3 4 5 6 7 8 9 10

时间复杂度

选择排序:O(N^2)
冒泡排序:O(N^2)
桶排序:O(M+N)
快速排序:O( NlogN)

结语

排序还有很多种方法有待学习,有其他方法的小伙伴也可以一起交流一下哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值