选择排序(Selection sort)、插入排序(Insertion sort)与气泡排序(Bubble
sort)
这三个排序方式是初学排序所必须知道的三个基本排序方式。
选择排序
将要排序的对象分作两部份,一个是已排序的,一个是未排序的,从后端未排序部份选择一个最小值,
并放入前端已排序部份的最后一个,
插入排序
像是玩朴克一样,我们将牌分作两堆,每次从后面一堆的牌抽出最前端的牌,然后插入前面一堆牌的适当位置,
冒泡排序
最大的元素会如同气泡一样移至右端,其利用比较相邻元素的方法,将大的元素交换至右端,所以大的元素会不断的往右移动,直到适当的位置为止。
基本的气泡排序法可以利用旗标的方式稍微减少一些比较的时间,当寻访完阵列后都没有发生
任何的交换动作,表示排序已经完成,而无需再进行之后的回圈比较与交换动作,例如:
排序前:95 27 90 49 80 58 6 9 18 50
27 90 49 80 58 6 9 18 50 [95] 95浮出
27 49 80 58 6 9 18 50 [90 95] 90浮出
27 49 58 6 9 18 50 [80 90 95] 80浮出
27 49 6 9 18 50 [58 80 90 95] ......
27 6 9 18 49 [50 58 80 90 95] ......
6 9 18 27 [49 50 58 80 90 95] ......
6 9 18 [27 49 50 58 80 90 95]
由于接下来不会再发生交换动作,排序提早结束在上面的例子当中,还加入了一个观念,就是当进
行至i与i+1时没有交换的动作,表示接下来的i+2至n已经排序完毕,这也增进了气泡排序的效率。
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
#define SWAP(x,y) {int t; t = x; x = y; y = t;}
void selsort(int[]); // 选择排序
void insort(int[]); //插入排序
void bubsort(int[]); // 气泡排序
int main(void)
{
int number[MAX] = {0};
int i;
srand(time(NULL));
printf("排序前:");
for(i = 0; i < MAX; i++)
{
number[i] = rand() % 100;
printf("%d ", number[i]);
}
printf("\n--------请选择排序方式-------\n");
printf("(1)冒泡排序(2)选择排序(3)插入排序\n输入序号:");
scanf("%d", &i);
switch(i)
{
case 1:
bubsort(number);
break;
case 2:
selsort(number);
break;
case 3:
insort(number);
break;
default:
printf("选项错误(1..4)\n");
}
return 0;
}
//插入排序
void insort(int number[])
{
int i, j, k, tmp;
for(j = 1; j < MAX; j++)
{
tmp = number[j];
i = j - 1;
while(tmp < number[i])
{
number[i+1] = number[i];
i--;
if(i == -1)
break;
}
number[i+1] = tmp;
printf("第 %d 次排序:", j);
for(k = 0; k < MAX; k++)
printf("%d ", number[k]);
printf("\n");
}
}
//选择排序
void selsort(int number[])
{
int i, j, k, m;
for(i = 0; i < MAX-1; i++)
{
m = i;
for(j = i+1; j < MAX; j++)
if(number[j] < number[m])
m = j;
if( i != m)
SWAP(number[i], number[m])
printf("第 %d 次排序:", i+1);
for(k = 0; k < MAX; k++)
printf("%d ", number[k]);
printf("\n");
}
}
//冒泡排序
void bubsort(int number[])
{
int i, j, k, flag = 1;
for(i = 0; i < MAX-1 && flag == 1; i++)
{
flag = 0;
for(j = 0; j < MAX-i-1; j++)
{
if(number[j+1] < number[j])
{
SWAP(number[j+1], number[j]);
flag = 1;
}
}
printf("第 %d 次排序:", i+1);
for(k = 0; k < MAX; k++)
printf("%d ", number[k]);
printf("\n");
}
}
分享到:
相关推荐
对数字6606 5241 4215 5164 6224 3781 6536 4105 2587 2548 4641 2899 8124 6624 1042 5669 471 8165 9308 6514 7708 13 4697 4110 5899 2831 3024 957 2454等进行冒泡选择插入排序
第27周-第02章节-Python3.5-冒泡 选择 插入排序.avi
有C予以编写的冒泡选择以及插入排序3种排序方法
交换排序 选择排序 冒泡排序 插入排序
插入排序 冒泡排序 堆排序 基数排序 选择排序 快速排序的源码 java实现
选择排序、插入排序、冒泡排序以及快速排序和归并排序的C语言实现,绝对可用
直接插入排序 选择排序 堆排序 归并排序 快速排序 冒泡排序等七种排序方法
采用c++描述了各种排序算法,包括选择排序 冒泡排序 插入排序 基数排序 快速排序 归并排序 。实验内容 1、创建排序类。 2、提供操作:选择排序、冒泡排序、插入排序、*基数排序、*快速排序、*归并排序。 3、*能够...
直接插入排序 冒泡排序 快速排序 直接选择排序 堆排序 二路归并排序 C#源代码 使用C#实现的数据结构中的排序算法
数据结构(c语言版)严蔚敏 吴伟民编著 中直接插入排序、折半排序、shell排序、冒泡排序、快速排序、选择排序、堆排序的实现、归并排序,使用c语言实现
21、折半插入排序 22、21、折半插入排序 22、冒泡排序 21、折半插入排序 22、冒泡排序 23、快速排序 21、折半插入排序 22、冒泡排序 23、快速排序 24、简单选择排序 21、折半插入排序 22、冒泡排序 23、快速排序 24...
有一个模板类写出了快速排序,冒泡排序,插入排序,选择排序四种算法。用的是C++哦
C# 常用经典算法,选择排序 冒泡排序 快速排序 插入排序 希尔排序
关于c#的一些算法 选择排序 冒泡排序 快速排序 插入排序 希尔排序 归并排序 基数排序 计数排序。。。
插入排序,选择排序,基数排序,冒泡排序的C++实现
C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序
合并排序,插入排序,希尔排序,快速排序,冒泡排序,桶排序的C语言实现,原创。
冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序源码实现,里面有详细讲解,对新手应该有帮助
详细介绍选择排序、冒泡排序、插入排序且有相应的代码分析
选择排序,冒泡排序,插入排序 基数排序,快速排序,归并排序