冒泡排序基础版
重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就交换二者的值,这样每次走访完一次就相对有序一次,依次循环即可,当进行至多n-1(n为数组元素个数)次即可完成排序。
#include<iostream>
#include<malloc.h>
using namespace std;
void BubbleSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0) return;
int i, j;
for(i = 0; i < nLength - 1; i++)
{
for(j = 0; j < nLength - 1 - i; j++)
{
if(arr[j] > arr[j+1])
{
arr[j] = arr[j]^arr[j+1];
arr[j+1] = arr[j]^arr[j+1];
arr[j] = arr[j]^arr[j+1];
}
}
}
}
int main()
{
int *arr = NULL; //指针==数组 指针需要初始化
int n,len;
cin>>n;
len = n;
arr = (int*)malloc(sizeof(int)*n); //指针使用需要malloc空间(malloc空间虚拟地址连续,物理地址不一定连续)
for(int i = 0; i < n; i++)
{
cin>>arr[i];
}
BubbleSort(arr,len);
for(int i = 0; i < n; i++)
{
cout<<arr[i]<<" ";
}
free(arr);
arr = 0;
return 0;
}
冒泡排序优化版
优化版本有两个地方(只修改void BubbleSort函数部分):
1.添加一个nflag标志:用于判断,若nflag经过一次循环判断nflag未改变,则说明此次循环的数据是有序的,则直接break,跳出循环。
2.nflag采用flag = j + 1的方法,最后的nflag个数值相对有序,循环一次后, i = nLength - nflag - 1;减少了nflag-1次数的循环;
void BubbleSort(int arr[],int nLength)
{
if(arr == NULL || nLength <= 0) return;
int i, j, nflag;
for(i = 0; i < nLength - 1; i++)
{
nflag = 0;
for(j = 0; j < nLength - 1 - i; j++)
{
if(arr[j] > arr[j+1])
{
arr[j] = arr[j]^arr[j+1];
arr[j+1] = arr[j]^arr[j+1];
arr[j] = arr[j]^arr[j+1];
nflag = j + 1;
}
}
if(nflag == 0) break;
i = nLength - nflag - 1;
}
}
注:三次异或^是将arr[j]和arr[j+1]的值交换
arr[j] = arr[j]^arr[j+1];
arr[j+1] = arr[j]^arr[j+1];
arr[j] = arr[j]^arr[j+1];