您的位置:首页 > 其它

冒泡和快排

2015-07-29 21:13 218 查看
#include<stdio.h>
#include<stdlib.h>
// bool Swap(int *arr,int x,int y)
// {
//  if(x==y)
//      return false;
//  else
//  {
//      arr[x]=arr[x]^arr[y];
//      arr[y]=arr[x]^arr[y];
//      arr[x]=arr[x]^arr[y];
//      return true;
//  }
// }
void Swap(int *arr,int x,int y)
{
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
////冒泡法稳定,相邻的元素比较///n^2///
void BubbleSort(int *arr,int len)
{
for (int i=0;i<len-1;i++)///记住一定是len-1趟,要保证最后有两个元素比较
{
for(int j=len-1;j>i;j--)
{
if(arr[j]<arr[j-1])    ///相邻的两个记录比较,较轻的冒泡到最上面
Swap(arr,j,j-1);
}
}
}
//////快排/////不稳定,平均nlog(n)
////随机选择一个数字作为基数,假如选择数组最右侧作为基数
////用变量j记录当前左边数字(比基数小的数)的最右边的数的下标
////i从左到右遍历数组,如果arr[i]比基数小,则arr[i]属于左边的数,
////把j自增,交换arr[j]和arr[i]。交换之前由于arr[j]已从左边的数变成了右边的数
////交换之后新的arr[j]又变成了左边的数,而j又变成了左边数最右的下标了
////扫描结束后,把j自增(增后arr[j]又属于右边的数了)与最右边的基数交换,此时j为划分结果
int Partion(int *arr,int left,int right)
{
int j=left-1;
int key=arr[right];
for(int i=left;i<right;i++)/////一定不要写成i<=right,会造成堆栈溢出满足不了left<=right
if(arr[i]<=key)
Swap(arr,++j,i);
Swap(arr,++j,right);
return j;
}
void Qsort(int *arr,int left,int right)
{
if(left>=right)
return;
int keyplace=Partion(arr,left,right);
Qsort(arr,left,keyplace-1);
Qsort(arr,keyplace+1,right);
}
int main()
{
int arr[]={9,4,6,3,2,8,4,2,1,1,5,0};
int len=sizeof(arr)/sizeof(arr[0]);
//BubbleSort(arr,len);
Qsort(arr,0,len-1);
for(int i=0;i<len;i++)
{
printf("%d\t",arr[i]);
}
printf("\n");
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息