Ⅰ 选择排序 冒泡排序 c语言
从程序运行需要的时间和储存空间来看,这两个吧,选择排序用的时间较少。我给你举个例子,这是一个比较直观的例子:
有十个数:10,9,8,7,6,5,4,3,2,1 。将他们按从小到大的顺序排成一列,用这两种方法的区别在于如下过程中:
1、 冒泡排序:
外层循环一共进行9次,第一次将10排到最后,这一步要经很9步交换,即将10依次和9,8,7……交换,成为如下顺序:9,8,7,6,5,4,3,2,1,10;接着第二次将9排到倒数第二,这一步要经过8步交换,变成如下顺序:8,7,6,5,4,3,2,1,9,10;同理执行共九大步,即可将它们最终排成1,2,3,4,5,6,7,8,9,10。
从这个过程可以看到,这种方法在这个过程中一共进行了9+8+7+6+5+4+3+2+1=45次比较和交换。
2、 选择排序:
外层也要经过9次大步,但是不用交换45次.首先要假定一个最大量假设是第一个,并用max标记,第一次,将10依次和9,8,7,6,5,4,3,2,1进行比较,但是只是和1进行了一次交换,这时数列成了:1,9,8,7,6,5,4,3,2,10;第二次:将1和9比较,发现9比较大,那么将9暂时定为最大max,再依次和8,7,6,5,4,3,2比较,最后发现9最大,就把9和倒数第二个位置上的2交换,这一大步共进行了两次交换;依次执行下去,后面每大步进行了两次交换,可以看出,一共进行了1+2+2+2+2+2+2+2+1=16次交换,但是也进行了45次比较。
从上面两种可以看出,这两个方法选择排序更高速,但是某些数据可能使得冒泡排序更高速,即交换次数较少,可以看出算法快慢和数据还是有一定关系的。
至于代码,我写了一个选择排序法的,c++环境运行通过:
请将下面代码复制粘贴到程序写入窗口,按下Ctrl+A全选后,按下Alt+F8即可自动对齐格式:
#include<stdio.h>
#include<time.h>/*包含时间函数,以便作为随机数种子*/
#include<stdlib.h>/*包含产生随机数的文件*/
void main()
{
int i,j,temp,max;
int a[10];
srand((unsigned)time(NULL));/*作用是可以每次产生不一样的随机数*/
for(i=0;i<10;i++)
{
a[i]=rand()%51+49;
}
for(i=0;i<10;i++)
{
printf("a[%d]=%2.0d\t\t",i+1,a[i]);/*控制格式*/
}
printf("\n");
for(i=0;i<10;i++)
{
temp =a[10-i];max=10-i;/*设定最大值*/
for(j=0;j<10-i;j++)
{
if(a[j]> temp)
{
temp =a[j];max=j;/*更新最大值*/
}
}
if(max!=10-i)
{
a[max]=a[10-i];a[10-i] = temp;/*不能忘记将找到最大值处用假设最大值补上!*/
}
}
for(i=0;i<10;i++)
{
printf("a[%d]=%d\t\t",i+1,a[i]);
}
}
没有写冒泡法的,相信你也能写了。写了这么久,希望得个辛苦分。
另外有问题随时问。
Ⅱ c语言。编写一个冒泡排序算法s使用指针将n个整型数据按升序排序
#include<stdio.h>
int main()
{
int a[111],t;
int *p=a;
int n;
scanf("%d",&n);
for(p=a;p<a+n;p++)
scanf("%d",p);
p=a;
for(int i=0;i<n;i++)
for(int j=0;j<n-1-i;j++)
if(p[j]>p[j+1])
{
t=p[j];
p[j]=p[j+1];
p[j+1]=t;
}
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
——————————————————————
#include<stdio.h>
#include<malloc.h>
#include<string.h>
int main()
{
char *p[30];
for(int i=0;i<5;i++)
{
p[i]=(char*)malloc(30*sizeof(char));
//使用指针变量时要先为其分配空间
gets(p[i]);
}
for(int i=0;i<5;i++)
puts(p[i]);
return 0;
}
Ⅲ c语言冒泡排序
冒泡排序,是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
冒泡排序就是把小的元素往前调或者把大的元素往后调:
比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
Ⅳ 编写一个C语言程序,使用指针实现冒泡排序。
修改后的程序
#include
<stdio.h>
#define
n
7
int
main()
{
int
i,j,ptr_2=0;
int
a[n],*ptr_1;
ptr_1=&a[0];
printf("输入%d个数:",n);
for
(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("ok1\n");
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if
(*(ptr_1+j)
<
*(ptr_1+j+1))
{
ptr_2=*(ptr_1+j+1);
*(ptr_1+j+1)=*(ptr_1+j);
*(ptr_1+j)=ptr_2;
}
}
}
printf("排序后的数为:
");
for(i=0;i<n;i++)
{
printf("%d
",*ptr_1);
ptr_1++;
}
printf("\n");
return
0;
}
注意ptr_2是指针,未申请空间不能*ptr_2复值。
Ⅳ C语言递归实现冒泡排序
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void show(int *a,int n)
{
while(n--)printf("%d ",*a++);
printf("\n");
}
void swap(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
}
void bubble(int *a, int n)
{
int i;
if(n<2)return;
for(i=0;i<n-1;i++)
if(a[i]>a[i+1])
swap(&a[i],&a[i+1]);
bubble(a,n-1);
}
int main()
{
int a[20];
const int n = sizeof(a)/sizeof(*a);
int i;
srand(time(0));
for(i=0;i<n;i++)a[i]=rand()%n;
show(a,n);
bubble(a,n);
show(a,n);
return 0;
}
Ⅵ c语言 指针的方法 对一维数组进行 冒泡排序
大概思路:用指针p指向数组的首地址,用指针去引用数组中的各个元素,并对数组中各个元素就行运算和比较操作了,代码可以参照如下:
#include
<stdio.h>
#include
<stdlib.h>
int
main()
{
int
array[5];
int
i,j,*p,temp;
p=array;
printf("please
input
some
integer:\n");
for(i=0;i<5;i++)
{
scanf("%d",p++);
}
p=array;
printf("排序前为:\n");
for(i=0;i<5;i++)
{
printf("%-5d",*p++);
}
p=array;
for(i=0;i<4;i++)
{
for(j=0;j<4-i;j++)
{
if(*(p+j)>*(p+j+1))
//用指针去引用数组中的元素并进行比较
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
printf("排序之后:\n");
for(i=0;i<5;i++)
{
printf("%-5d",*p++);
}
return
0;
}
Ⅶ C语言冒泡排序法是什么
冒泡排序法,是C语言常用的排序算法之一,意思是对一组数字进行从大到小或者从小到大排序的一种算法。
具体方法是:
相邻数值两两交换。从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不同,则将两个数的位置进行交换(对调);如果其与我们的期望一致,则不用交换。重复这样的过程,一直到最后没有数值需要交换,则排序完成。
C语言常见的排序算法:
1、冒泡排序
基本思想:比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,选出一个未排序中最大的数放到数组后面。
2、快速排序
基本思想:选取一个基准元素,通常为数组最后一个元素(或者第一个元素)。从前向后遍历数组,当遇到小于基准元素的元素时,把它和左边第一个大于基准元素的元素进行交换。在利用分治策略从已经分好的两组中分别进行以上步骤,直到排序完成。
3、直接插入排序
基本思想:和交换排序不同的是它不用进行交换操作,而是用一个临时变量存储当前值。当前面的元素比后面大时,先把后面的元素存入临时变量,前面元素的值放到后面元素位置,再到最后把其值插入到合适的数组位置。
4、直接选择排序
基本思想:依次选出数组最小的数放到数组的前面。首先从数组的第二个元素开始往后遍历,找出最小的数放到第一个位置。再从剩下数组中找出最小的数放到第二个位置。以此类推,直到数组有序。
以上内容参考 网络-排序算法、网络-c语言冒泡排序
Ⅷ C语言冒泡排序法是怎么排序的
C语言冒泡排序法的排序规则:
将被排序的记录数组R[1..n]垂直排列,每个记录R看作是重量为R.key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
初始 R[1..n]为无序区。
第一趟扫描 从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。
即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换R[j+1]和R[j]的内容。 第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。
第二趟扫描 扫描R[2..n]。
扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上…… 最后,经过n-1 趟扫描可得到有序区R[1..n] 注意: 第i趟扫描时,R[1..i-1]和R[i..n]分别为当前的有序区和无序区。扫描仍是从无序区底部向上直至该区顶部。扫描完毕时,该区中最轻气泡飘浮到顶部位置R上,结果是R[1..i]变为新的有序区。