题目:随机产生10个0-9的整数,用冒泡排序改进版对10个数进行排序。(升序)
程序分析:
- 对于冒泡排序法,如果输入六个数,则需要5趟排序。如果在第3趟排序之后就完成排序,则后2趟排序就没有任何意义。
- 因此,对冒泡排序法进行改进。
- 设置一个标志变量flag,并规定:
- flag=1时,表示本趟排序中有元素交换;
- flag=0时,表示本趟排序中没有元素交换。
- 在每一趟排序之前将flag置为0,如果该趟出现元素交换flag置为1,反之flag值不变。这样,便可根据flag的值决定是否要进行 下一趟排序 。
C代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
void BubbleSort(int a[], int n) {
int flag = 1;//flag=1表示未完成排序,flag=0表示已完成排序
for (int i = 0; i < n - 1; i++) {
flag = 0;
for (int j = 0; j < n - i - 1; j++) {
if (a[j] > a[j + 1]) {
flag = 1;
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
void PrintArray(int a[], int n) {
for (int j = 0; j < n; j++) {
printf("%d ", a[j]);
}
printf("\n");
}
int main() {
int array[10];
int n = sizeof(array) / sizeof(array[0]);
srand((unsigned int)time(NULL));
for (int i = 0; i < n; i++) {
array[i] = rand() % 10;
}
printf("排序前:");
PrintArray(array, n);
BubbleSort(array, n);
printf("排序后:");
PrintArray(array, n);
return 0;
}
C运行结果:C++代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<ctime>
using namespace std;
void BubbleSort(int a[], int n) {
int flag = 1;//flag=1表示未完成排序,flag=0表示已完成排序
for (int i = 0; i < n - 1; i++) {
flag = 0;
for (int j = 0; j < n - i - 1; j++) {
if (a[j] > a[j + 1]) {
flag = 1;
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
void PrintArray(int a[], int n) {
for (int j = 0; j < n; j++) {
cout << a[j] << " ";
}
cout << endl;
}
int main() {
int array[10];
int n = sizeof(array) / sizeof(array[0]);
srand((unsigned int)time(NULL));
for (int i = 0; i < 10; i++) {
array[i] = rand() % 10;
}
cout << "冒泡排序前:";
PrintArray(array, n);
BubbleSort(array, n);
cout << "冒泡排序后:";
PrintArray(array, n);
return 0;
}
C++运行结果: