快速排序的递归和非递归算法

 

 

递归快速排序的思想:


1.选择任何一个数作为基准数,找到这个基准数的位置

2.基准数一侧的数大于另一侧的数,对两侧进行排序,这是分治的思想



//递归算法:

#include<stdio.h>

void main()
{
int i,num[6]={3,1,2,6,8,9};


for(i=0;i<6;i++)
{
printf("%d  ",num[i]);
}
int partition(int array[],int left,int right);
    void quick_sort(int array[],int left,int right); 


quick_sort(num,0,5);

for(i=0;i<6;i++)
{
printf("%d  ",num[i]);
}
}




int partition(int array[],int left,int right)
{
  int temp;
  temp = array[left];
  while(left < right)
  {
  while(temp<array[right]&&left < right)
  right--;
  if(left  < right)
  array[left++]=array[right];


  while(temp > array[left] && left < right)
  left++;
  if(left  < right)
  array[right--]=array[left];   
  }
    array[left] = temp;


return left;   
}


void quick_sort(int array[],int left,int right)
{
if(left<right)
{
    int part = partition(array,left,right);


quick_sort(array,left,part-1);
quick_sort(array,part+1,right);
}

}

//非递归快速排序的思想:用栈,递归是用系统的栈来保存函数的参数。


#include<iostream>

#include<stack>

using namespace std;


int partition(int array[],int left,int right)
{
 int temp;
 temp = array[left];
 while(left < right)
 {
  while(temp<array[right]&&left < right)
   right--;
  if(left  < right)
   array[left++]=array[right];
  
  
  while(temp > array[left] && left < right)
   left++;
  if(left  < right)
   array[right--]=array[left]; 
 }
    array[left] = temp;
 
 
 return left;  
}

void quick_sort_noncur(int array[],int l,int r)
{
 if(l>r)
  return;
 stack<int> s;
 int mid= partition(array,l,r);
 
 if(l < mid)
  
 {
  s.push(l);
  s.push(mid-1);
  
 }
 if(mid+1<r)
 {
  s.push(mid+1);
  s.push(r);
  
 }
 
 while(!s.empty())
 {
        int  max = s.top();
  s.pop();
  int min = s.top();
  s.pop();
  
  mid=partition(array,min,max);
  
  if(min < mid-1)
  {
   s.push(min);
   s.push(mid-1);
   
  }
  
  if(mid+1<max)
  {
   s.push(mid+1);
   s.push(max);
  }
 }
 
}


void main()
{
 int i,num[6]={3,1,2,6,8,9};
 
 
 for(i=0;i<6;i++)
 {
  printf("%d  ",num[i]);
 }
 
 quick_sort_noncur(num,0,5);
 
 for(i=0;i<6;i++)
 {
  printf("%d  ",num[i]);
 }
 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值