https://blog.csdn.net/hansionz/article/details/80822494
先看冒泡
#include <stdio.h>
#include "string.h"
#include "malloc.h"
#include "iostream"
#include<time.h>
using namespace std;
int table[10]={4,3,7,1,99,55,2,53,44,32};
//遍历数组
void show(int a[],int l,int r )
{
for(int i=l;i<=r;i++)
printf("%5d",a[i]);
printf("\n");
}
/*一 :对总趟数进行优化
如果那一趟排序没有交换元素,说明这组数据已经有序,不用再继续下去。
优化1——定义一个flag,用来判断有没有进行交换,如果在某次内层循环中没有交换操作,
就说明此时数组已经是有序了的,不用再进行判断,这样可以节省时间。
*/
void bubble1(int *a,int l,int r)
{
int i;
int j=0;
int flag=1;
for (j=0;j<=(r-l)&&flag;j++)//控制趟数
for (i=l;i<r-j;i++)//一趟的冒泡
{
flag=0;
if (a[i]>a[i+1])
{
int temp=a[i+1];
a[i+1]=a[i];
a[i]=temp;
flag=1; //有比较过程,则置位标志位
}
}
}
void bubble11(int *a,int l,int r)
{
int i;
int j=0;
int flag=1;
for (j=0;j<=(r-l);j++)
{
for (i=l;i<r-j;i++)
{
flag=0;
if (a[i]>a[i+1])
{
int temp=a[i+1];
a[i+1]=a[i];
a[i]=temp;
flag=1; //有比较过程,则置位标志位
}
if (flag==0)
{
return;
}
}
}
}
/*第二种是趟内优化 ,记录最后一次交换的位置*/
void bubble2(int *a,int l,int r)
{
int i;
int j=0;
int flag = 0;
int pos = 0;//用来记录最后一次交换的位置
int k =r;
for (j=0;j<=(r-l);j++)
{
pos = 0;
int i = 0;
flag = 0;
for (i=l;i<k;i++)
{
flag=0;
if (a[i]>a[i+1])
{
int temp=a[i+1];
a[i+1]=a[i];
a[i]=temp;
flag=1; //有比较过程,则置位标志位
pos=i;
}
}
if (flag==0)
{
return;
}
k=pos;
}
}
void main(){
srand( 55 );
for(int i = 0; i < 10; i++ )
printf( "Random number #%d: %d\n", i, rand() );
int *p=(int *)malloc(sizeof(table));
memcpy(p,table,sizeof(table));
cout<<"=================";
show(p,0,9);
cout<<"=================";
bubble2(p,0,9);
cout<<"======dd===========";
show(p,0,9);
cout<<"=================";
}