冒泡 快排

本文介绍了两种经典的排序算法:冒泡排序和快速排序。详细展示了这两种算法的实现过程,并通过具体的代码示例来解释其工作原理。对于冒泡排序,文章提供了逐步比较并交换元素的实现方式;而对于快速排序,则采用递归和栈两种不同的实现方案进行说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void Bubblesort(int* arr,size_t size)
{
assert(arr);
for(int i=0;i<size;++i)
{
bool exchange=false;
for(int j=1;j<size-i;j++)
{
if(arr[j-1]>arr[j])
{
                exchange=true;
std::swap(arr[j-1],arr[j]);
}
}
if(!exchange)
{
return;
}
}
}
int portion(int* arr,int left,int right)
{
int begin=left;
int end=right;
int key=right;
   while(begin<end)
   {
  while(begin<end && arr[begin]<=key)
  begin++;
 
  if(begin<end)
  {
  arr[end]=arr[begin];
  end--;
      }

 while(begin<end && arr[end]>=key)
 end--;
 
 if(begin<end)
 {
 arr[begin]=arr[end];
 begin++;
 }
 
   }
 arr[begin]=key;
  return begin;
}
int getmidindex(int *arr,int left,int right)
{
assert(arr);
int mid=left+(right-left)/2;
if(arr[left]<arr[right])
{

if(arr[left]>arr[mid])
     {
             return left;
     }
else if(arr[mid]>arr[right])
{
           return right;
}
else
{
return mid;
}
}
else
{
if(arr[mid]>arr[left])
{
return left;
}
else if(arr[mid]<arr[right])
{
return right;
}
else
{
return mid;
}
}
}
int portion2(int* arr,int left,int right)
{
    assert(arr);
int begin=left;
int end=right;
int key=arr[right];
int prev=begin-1;
/*int midindex=getmidindex(arr,left,right);
if(midindex!=right)
{
std::swap(arr[midindex],arr[right]);
}*/
while(begin<right)
{
if(arr[begin]<key && begin!=++prev)
{
std::swap(arr[begin],arr[prev]);
}
begin++;

}
std::swap(arr[++prev],arr[right]);

return prev;



}
 /*void Quicksort(int* arr,int left,int right)
{
assert(arr);
if(left<right)
{
       int boundary=portion2(arr,left,right);
  Quicksort(arr,left,boundary-1);
  Quicksort(arr,boundary+1,right);
}
}*/
void Quicksort(int* arr,int left,int right)
{
assert(arr);
stack<int> s;
    s.push(right);
s.push(left);
while(!s.empty())
{
 int begin=s.top();
 s.pop();
 int end=s.top();
 s.pop();
 if(begin<end)
 {
 int boundary=portion2(arr,begin,end);
 s.push(end);
 s.push(boundary+1);
 s.push(boundary-1);
 s.push(begin);


 }
}
}
int getmidindex(int *arr,int left,int right)
{
assert(arr);
int mid=left+(right-left)/2;
if(arr[left]<arr[right])
{

if(arr[left]>arr[mid])
     {
             return left;
     }
else if(arr[mid]>arr[right])
{
           return right;
}
else
{
return mid;
}
}
else
{
if(arr[mid]>arr[left])
{
return left;
}
else if(arr[mid]<arr[right])
{
return right;
}
else
{
return mid;
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值