冒泡排序是排序算法的一种,思路清晰,代码简洁,常被用在大学生计算机课程中。“冒泡”这个名字的由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。这里以从小到大排序为例进行讲解。基本思想及举例说明
冒泡排序的基本思想就是不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较就,选出最大的数;经过第2轮比较,就选出次大的数,以此类推。下面以对 3 2 4 1 进行冒泡排序说明。
1.这个算法用rand函数产生新的要排序的数据,与已有的有序数列中的数据依次比较,如果遇到比他大的数据,就从该数据开始,一直交换到末尾,达到一个插入的效果。从而形成有序的数列。
2.此外,只用rand函数并不能达到真正随机的效果。如果要实现真正随机的效果,还要配合srand函数才行。
3.具体代码如下:#include "stdio.h"#include "stdlib.h"void main(){int a[10],temp,rprintf("请输入一个种子\n")scanf("%d",&r)srand(r)for(int i=0i<9i++) 。
冒泡排序法的具体实现方法是这样的,从数组的第一个元素`arr[0]`开始,两两比较**(`arr[n],arr[n+1]`),如果前面的数大于后面的数(`arr[n] >arr[n+1]`),那么交换两个元素的位置,把大的数往后移动。这样依次经过一轮比较以后,最大的数将会被交换到最后的位置(arr[n-1])。
C语言实现Bubblesort:
void bubblesort(int a[], int m){
int i,j
int tmp
int flag = 0 //设定标志,如果第一次循环比较时没有发生交换,则说明数组是升序排序,不用排序,提前结束循环。
for(i = 0 i < m i++) //外层循环控制循环次数
{
for(j = 0 j < m-1-i j++) //内层循环控制每次循环里比较的次数。
{
if(a[j] > a[j+1])
{
tmp = a[j]
a[j] = a[j+1]
a[j+1] = tmp
flag = 1
}
}
if(0 == flag)
{
printf("No Sort\n")
break
}
}
}
选择排序法的过程是,通**过比较,选择出每一轮中最值元素,然后把他和这一轮中最最前面的元素交换**,所以这个算法关键是要记录每次比较的结果,即每次比较后最值位置(下标)。
C语言实现(Selectionsort)
void selectionsort(int a[],int m){
int i,j
int k
int tmp
for(i = 0 i < m-1 i++)//控制循环次数,n个数需要n-1次循环
{
k = i
for(j = i+1 j < m j++)
{
if(a[j] < a[k])
k = j
}
//i不等于k是就证明a[i]不是最小的,
//i等于k时证明a[i]就是本轮比较过程中最小的值
if(i != k)
{
tmp = a[i]
a[i] = a[k]
a[k] = tmp
}
}
}
#include<stdio.h>
void main()
{
int a[10]
int i,j,t
printf("input 10 numbers:\n")
for(i=0i<10i++)
scanf("%d",&a[i])
for(j=0j<9j++) /*进行9次循环 实现9趟比较*/
for(i=0i<9-ji++) /*在每一趟中进行9-j次比较*/
if(a[i]>a[i+1]) /*相邻两个数比较,想降序只要改成a[i]<a[i+1]*/
{
t=a[i]
a[i]=a[i+1]
a[i+1]=t
}
printf("the sorted numbers:\n")
for(i=0i<10i++)
printf(" %d",a[i])
}
扩展资料:冒泡排序算法的运作
1、比较相邻的元素。如果第一个比第二个大(小),就交换他们两个。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大(小)的数。
3、针对所有的元素重复以上的步骤,除了最后已经选出的元素(有序)。
4、持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。
简单的表示
#include <stdio.h>
void swap(int *i, int *j)
{
int temp = *i
*i = *j
*j = temp
}
int main()
{
int a[10] = {2,1,4,5,6,9,7,8,7,7}
int i,j
for (i = 0i <10i++)
{
for (j = 9j >ij--)//从后往前冒泡
{
if (a[j] <a[j-1])
{
swap(&a[j], &a[j-1])
}
}
}
for (i = 0i <10i++)
{
printf("%d\n", a[i])
}
return 0
}
参考资料来源:冒泡排序-百度百科