冒泡排序:
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
排序思路:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define DATASIZE 10
/**************************冒泡排序************************************
*
* 思路分析:让前一个元素与后一个元素比较,如果大于,则交换两个元素位置
* 这样经过循环一次过后就会把最大的一个元素放在最后面,这样的操作
* 需要执行n-1次;然后继续上面的操作那么,就会得到第二大的元素,
* 以此类推,那么就要进行n-2次这样的操作。
*
*********************************************************************/
void BubbleSort(int arr[])
{
int i;//趟数
int j;//每趟需要执行的比较次数
int tmp;//备份要交换的元素
for(i = 0; i < DATASIZE; i++){ //趟数
for(j = 0; j < DATASIZE -1 - i; j++)//每趟执行的比较次数
{
//升序排列,先找到最大的元素,放在最后面
if(arr[j] > arr[j + 1]) //如果把'>'改为'<',那么就是降序排列
{
tmp = arr[j];
arr[j] = arr[j + 1]; //后一个与前一个交换位置
arr[j + 1] = tmp; //前一个与后一个交换位置
}
}
}
}
int main()
{
srand(time(NULL));
int arr[DATASIZE];
printf("未排序之前的数列:");
for (int i = 0; i < DATASIZE; i++)
{
arr[i] = rand()%100;
printf("%-2d ",arr[i]);
}
printf("\n");
BubbleSort(arr);
printf("已排序之后的数列:");
for (int i = 0; i < DATASIZE; i++)
{
printf("%-2d ",arr[i]);
}
printf("\n");
return 0;
}