冒泡排序
首先引入两个概念:
顺序:如果两个数据的位置符合排序的需要,则称它们是顺序的。
逆序:如果两个数据的位置不符合排序需要,则称它们是逆序的。
冒泡排序基于这样一种简单的思路:从头到尾让每两个相邻的元素进行比较,顺序就保持位置不变,逆序就交换位置。可以预料,经过一轮比较,序列中具有“极值”的数据,将被挪>>至序列的末端。
假如序列中有$n$个数据,那么在最极端的情况下,只需要经过$n-1$轮的比较,则一定可以将所有的数据排序完毕。冒泡法排序的时间复杂度是$O(n^2)$
#include <stdio.h>
#include <stdbool.h>
//#define 10 10
void swap(int *a ,int *b)
{
int tmp ;
tmp = *a;
*a = *b;
*b = tmp;
}
/*
void bubbleinsert(int data[], int len)
{
//
int j = 0;
while(1)
{
int i;
for(i = 0;i<len-1-j;i++)
{
if(data[i] < data[i+1]);
{
continue;
}
}
swap(&data[i],&data[i+1]);
j++;
}
}
*/
void bubbleinsert(int data[], int len)
{
int i,j;
for(j = 0;j<len-1;j++)
for(i = 0; i < len-1-j ; i++)
{
if(data[i] > data[1+i])
{
swap(&data[i],&data[i+1]);
}
}
}
/*void bubbleinsert(int data[], int len)
{
int k=0;
while(1)
{
bool done = true;//用来表示如果随机数已经是有序数直接跳出while
int i;
for(i=0; i<len-1-k; i++)
{
//comp_count++;
if(data[i] <= data[i+1])
{
continue;
}
swap(&data[i], &data[i+1]);
done = false;
}
if(done)
break;
k++;
}
}*/
int main(int argc, char const *argv[])
{
//产生随机数
srand (time(NULL));
int i;
int data[10];
//将产生的随机数放入数组中
for (i = 0; i < 10; i++)
{
data[i] = rand()%100;//产生随机数为两位数
}
//进行冒泡排序
bubbleinsert(data, 10);
for (i = 0; i < 10; i++)
{
printf("%d排序为:%d\t",i,data[i]);
printf("\n");
}
return 0;
}