
关于冒泡最优情况说明一下,O(n)是指在使用标志情况下,否则仍是O(n)。
冒泡排序:
//本人习惯先把最大的选出来,放到右边
void maopao(int arr[],int n)
{
int i,j,tmp;//tmp提前写上,或者及时补上!
for (i=n-1;i>=0;i--)//不能少写等号!
for(j=0;j<i;j++)
{
if(arr[j]>arr[j+1])//不比较等于情况!否则就不稳定了!
{
tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
}
}
return;
}
使用标志的冒泡排序,最好可达到O(n):
void bubble_sort(int d[], int size)
{
//假定两两交换发生在数组最后的两个位置
int exchange = size - 1;
while(exchange)
{
int bound = exchange;//记录下发生数据交换的位置
exchange = 0; //假定本趟比较没有数据交换
for(int i = 0; i < bound; i++)
{
if (d[i] > d[i + 1])//交换
{
int t = d[i];
d[i] = d[i + 1];
d[i + 1] = t;
exchange = i + 1;
}
}
}
}
快速排序:
void fast(int arr[],int left,int right)
{
int i,j,k;
if(left<right){
i=left+1;j=right;
while(i<j){
while(arr[i]<arr[left]&&i<right)i++;//
while(arr[j]>arr[left]&&j>left)j--;//
if(i<j) swap(&arr[i],&arr[j]);//大部分时候必要,最后那次在循环外完成
};
swap(&arr[j],&arr[left]);//
fast(arr,left,j-1);
fast(arr,j+1,right);
}
return;
}
插入排序:
void insert(int arr[],int n)
{
int i=0,j=0,k=0,tmp;
for(i=1;i<=n-1;i++)
{
for(j=i-1;j>=0;j--)//忘记写=0了,结果gdb半天才发现!
{
if(arr[j]>arr[j+1])//
swap(&arr[j],&arr[j+1]);
else
break;
}
}
return;
}
选择排序:
void select1(int arr[],int n)
{
int i=0,c=0,j=0;
int place,min;//
for(i=0;i<n;i++)
{ min=arr[i];;//切莫忘记每次初始化,否则各种奇怪错误!仅在外面初始化为0还不够!
for(j=i+1;j<=n;j++)
if (arr[j]<min)
{
min=arr[i];place=j;
}
if(place!=i)
swap(&arr[i],&arr[place]);
}
return;
}
void select2(int arr[],int n)
{
int i=0,c=0,j=0,place=0,min=0;
min=arr[1];
for(i=c;i<n;i++)
{ for(j=i+1;j<=n;j++)
if (arr[j]<min)
{min=arr[i];place=j;}
swap(&arr[i],&arr[place]);
c++;
}
return;
}