本文受此文章启发
主要思路:一个函数Up负责上浮,一个函数Down负责下沉,一个while循环中进行上浮和下沉,同时设置flag判断是否有上浮下沉操作,如果都没有则排序结束
/*实现内容
* 上浮下沉交替进行的冒泡排序
*
* PS:0号不存元素
* VS2019 编译通过 王大花 2020.8.21
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define Number_Num 12
int* Get_Rand_Num() {
int* tmp = (int*)malloc(sizeof(int) * (Number_Num + 1));
if (NULL == tmp)
return NULL;
for (int i = 1; i <= Number_Num; i++)
tmp[i] = rand() % 100;
return tmp;
}
void Print(int* Num) {
for (int i = 1; i <= Number_Num; i++)
printf("%d ", Num[i]);
printf("\n");
}
void Swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
//上浮
int Up(int* Num, int low, int high) {
int flag = 0;
while (low < high) {
if (Num[low] > Num[low + 1]) {
Swap(Num + low, Num + low + 1);
flag = 1;
}
low++;
}
return flag;
}
//下沉
int Down(int* Num, int low, int high) {
int flag = 0;
while (high > low) {
if (Num[high] < Num[high - 1]) {
Swap(Num + high, Num + high - 1);
flag = 1;
}
high--;
}
return flag;
}
//冒泡排序
void Bubble_Sort(int* Num) {
int high = Number_Num, low = 1;
while (low < high) {
int If_Up = Up(Num, low, high--);
int If_Down = Down(Num, low++, high);
if (!If_Down && !If_Up)
break;
}
}
int main() {
srand((unsigned)time(NULL));
int* Num = Get_Rand_Num(Number_Num);
Print(Num);
Bubble_Sort(Num);
Print(Num);
return 0;
}