冒泡排序
冒泡排序,基本思想是采用双重循环,外层循环用于控制冒泡的轮数,内层循环控制每一轮冒泡的次数,每一轮冒泡都会产生一个最大或者最小的数放在数组的末尾,下一轮循环时,只需要从剩余的元素找出一个最大或者最小数,知道整个数组有序。
数组方法
#define _CRT_SECURE_NO WARINGS 1
#include<stdio.h>
#include<windows.h>
//打印输出函数
void Print(int ar[], int size)
{
for (int i = 0; i <size; i++){
printf("%d ",ar[i]);
}
printf("\n");
}
//用Swap函数来交换两个变量的值
void Swap(int* a, int* b) {
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
void BubbleSort(int ar[], int size)
{
int flag = 1;
//外层控制冒泡轮数,内层控制每轮冒泡次数
for (int i = 0; i < size - 1; i++) {
//此处注意循环执行的条件,因为每一轮结束都会找出一个最大\
或者最小的数,所以size-1后面有-i,否则会有重复的比较
for (int j = 0; j < size - 1-i; j++) {
if (ar[j] > ar[j+ 1]) {
Swap(& ar[j], & ar[j + 1]);
flag = 0;//数组元素发生交换时flag赋0
}
}
//若flag为1,表示本轮没有进行交换,则表明当前\
数组已经有序,无需再进行冒泡
if (flag) {
break;
}
}
}
int main()
{
int arr[] = {24,10,9,88,65,30};
// 冒泡前后分别打印一次
Print(arr,6);
BubbleSort(arr, 6);
Print(arr, 6);
system("pause");
return 0;
}
指针方法
#include<stdio.h>
#include<windows.h>
#include<assert.h>
void Print(int *p, int sz)
{
assert(p);
for (int i = 0; i < sz; i++){
printf("%d ", *p++);
}
printf("\n");
}
void BubbleSort(int*p, int sz)
{
int flag = 1;//标记
assert(p);
for (int i = 0; i < sz - 1; i++){
for (int j = 0; j < sz - 1-i;j++){
if (*(p + j) < *(p + j + 1)){
//异或法交换两个数的值
*(p + j) ^= *(p + j + 1);
*(p + j + 1) ^= *(p + j);
*(p + j) ^= *(p + j + 1);
flag = 0;
}
}
//若一轮冒泡后没有发生顺序改变,则说明数组已经有序
if (flag){
break;
}
}
}
int main()
{
int ar[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int sz = sizeof(ar) / sizeof(ar[0]);
Print(ar, sz);
BubbleSort(ar, sz);
Print(ar, sz);
system("pause");
return 0;
}