排序1-冒泡排序
冒泡排序的次数是递减的, 第一次确定了最大元素的位置, 所以第二次只需要进行n-1次排列, 第二次确定了第二大元素的位置, 所以第三次只需要进行n-2次排列, 以此类推
for (int i = 0; i < len; i++){
//每次遍历的次数是递减的
//所以j=len-1-i
for (int j = 0; j < len-1-i; j++){
if(arr[j]>arr[j+1])
Swap(&arr[j], &arr[j+1]);
}
交换元素位置
//交换
void Swap(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
冒泡排序
//冒泡排序
void BubbleSort(int arr[]){
int len = MAX;
for (int i = 0; i < len; i++){
for (int j = 0; j < len-1-i; j++){
if(arr[j]>arr[j+1])
Swap(&arr[j], &arr[j+1]);
}
}
}
打印
//打印数组
void PrintArray(int arr[]){
int len = MAX;
for (int i = 0; i < len; i++){
cout << arr[i] << " ";
}
cout << endl;
}
测试
int main(){
int arr[MAX];
srand((unsigned int)time(NULL));
for (int i = 0; i < MAX; i++){
arr[i] = rand() % MAX;
}
cout << "排序前: ";
PrintArray(arr);
BubbleSort(arr);
cout << "排序后: ";
PrintArray(arr);
system("pause");
return 0;
}
优化
在一次排序中如果没有元素交换, 说明每一个元素都比它前一个元素大(正序), 此时排序已经完成, 可以提前终止排序.
int flag = 0; //0表示false, 标志没有排序好
//冒泡排序
void BubbleSort(int arr[]){
int len = MAX;
for (int i = 0; i<len && flag==0; i++){
flag = 1; //认为已经排序好了
for (int j = 0; j < len-1-i; j++){
if(arr[j]>arr[j+1]){//有元素比它前一个元素小时触发
flag = 0; //将排序标志更新为没有排序好
Swap(&arr[j], &arr[j+1]);
}
}
}
}
标签:arr,int,len,++,冒泡排序,排序 From: https://www.cnblogs.com/HIK4RU44/p/18149534