●冒泡排序法
算法原理:
依次比较相邻两个元素的大小,若后面的比前面的小,则交换两个元素的位置
对每一对相邻元素作同样的工作,从第一对到最后一对。
进行一轮比较交换下来,最后的元素就会是最小的数了,这个数就不用参与后面的比较操作了
思路:
遍历数组,对数组中相邻的两个元素进行比较,如果需要升序,前一个数据大于后一个数据时,
交换两个位置上的数据,直到所有的数据比较完,此时,最大的数据已经放在数组的末尾。
除最大数据已经排好序外,其余数据还是无需,对剩余数据采用与上述类似的方式
进行处理即可
写法一:
void BubbleSort(int *arr,int n)
{
int i=0;
int j=0;
for(i=0;i<n-1;i++) //注意判定条件
{
for(j=0;j<n-i-1;j++) //注意判定条件
{
if(arr[j]>arr[j+1])
{
int temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
}
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
写法二:
void BubbleSort(int array[], int size)
{
// 外层循环控制冒泡排序的趟数
// size-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略
for(int i = 0; i < size-1; ++i)
{
// 具体冒泡的方式:用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾
for(int j = 1; j < size-i; ++j)
{
if(array[j-1] > array[j])
{
int temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
}
}
}
}
int main()
{
int arr[]={1,4,2,6,5,8,7,9,10};
int n=sizeof(arr)/sizeof(arr[0]);
BubbleSort(arr,n);
int i=0;
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
优化:如果某次冒泡结束后,序列已经有序了,后面剩余元素的冒泡可以省略
void BubbleSort(int array[], int size)
{
// 外层循环控制冒泡排序的趟数
// size-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略
for(int i = 0; i < size-1; ++i)
{
int isChange = 0;
// 具体冒泡的方式:用相邻的两个元素进行比较,前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾
for(int j = 1; j < size-i; ++j)
{
if(array[j-1] > array[j])
{
int temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
isChange = 1; //如果本次冒泡进行数据交换了,说明本次还是无序的,就将isChange设置为1
}
}
// 如果本次冒泡中,元素没有交换,则本次开始冒泡时,数据已经有序了,后面的冒泡可以不用进行了
if(!isChange)
return;
}
}
冒泡排序&&优化后的冒泡排序
最新推荐文章于 2022-11-05 10:54:49 发布