//冒泡排序的优化算法
void BubbleSort(int a[],int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
int flag=0;//交换标志位初始值是0
for(j=0;j<n-i-1;j++)
{
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1; //因为进行了交换操作 标志位flag变成1
}
}
if(flag==0) //若未进行交换 说明数组是有序的 直接返回
return ;
//每一轮排序后输出元素顺序
for(int k=0;k<n;k++)
{
cout<<a[k]<<" ";
}
cout<<endl;
}
///
//选择排序
void SelectSort(int a[],int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;//k记录 假设的最小值所在的位置
for(j=i+1;j<n;j++)
{
if(a[k]>a[j])
k=j;//k记最小的数的位置 如果k记录最大的数的位置(if(a[k]<a[j])) 则按从大到小排序
}
if(k!=i)
{
int temp;
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
for(int k=0;k<n;k++)
cout<<a[k]<<" ";
cout<<endl;
}
}
//
//快速排序
int Partition(int a[],int low,int high)
{
int privot=a[low];
while(low<high)
{
while(low<high && a[high]>=privot)
--high;
a[low]=a[high];
while(low<high && a[low]<=privot)
++low;
a[high]=a[low];
}
a[low]=privot; //a[high]=privot;
return low;
}
void QuickSort(int a[],int low,int high)
{
if(low<high)
{
int privotpos=Partition(a,low,high);
QuickSort(a,low,privotpos-1);
QuickSort(a,privotpos+1,high);
}
}
///
垒堆排序:完全二叉树
1.创建堆
2.排序
void CreateHeap(int *a,int root,int len)
{
int i = 2 * root; // 左边子节点的下标
int t = a[root];
while(i <= len)
{
if(i < len) // 说明有两个孩子
{
if(a[i] < a[i+1])
++i;//i为最大孩子的下标
}
if(t >= a[i])
break;
else
{
a[i/2] = a[i];
i = 2 * i;
}
}
a[i/2] = t;
}
void Sort(int *a,int len)
{
int i,t;
for(i = len/2;i>=1;i--) //第一次创建大根堆
CreateHeap(a,i,len);
for(i = len;i>=1;i--)
{
t = a[1];
a[1] = a[i];
a[i] = t;
CreateHeap(a,1,i-1);
}
}
void main()
{
int a[] = {0,6,5,4,3,2,1,7,8,9};
int n = sizeof(a) / sizeof(a[0])-1;
Sort(a,n);
for(int i = 1;i<=n;i++)
cout<<a[i]<<" ";
}
///
//归并排序
int b[7]={0};//辅助数组b
//将表a的两段a[low...mid] 和a[mid+1..high]各自有序,将它们合并成一个有序表
void Merge(int a[],int low,int mid,int high)
{
int i,j;
for(int k=low;k<=high;k++)
b[k]=a[k]; //将a中的元素全部复制到b中
for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++)
{
if(b[i]<=b[j]) //比较b的左右两段中的元素
a[k]=b[i++]; //将较小值复制到a中
else
a[k]=b[j++];
}
while(i<=mid) a[k++]=b[i++]; //若第一个表未检测完 复制
while(j<=high) a[k++]=b[j++]; //若第二个表未检测完 复制
}
void MergSort(int *a,int low,int high)
{
if(low<high)
{
int mid=(low+high)/2; //从中间划分两个子序列
MergSort(a,low,mid); // 对左侧子序列进行递归排序
MergSort(a,mid+1,high); // 对右侧子序列进行递归排序
Merge(a,low,mid,high); //归并
}
}