c快速排序写完数据不对,请帮我看看哪里出问题了

问题遇到的现象和发生背景

快速排序

问题相关代码,请勿粘贴截图

```c++
//快速排序
#include<iostream>
#include<cstdio>
using namespace std;


 int partition(int arr[],int p,int r){//分割扫描 
    int pivot=arr[p];
    int sp=p+1;             //扫描指针 
    int bigger=r;           //右侧固定指针
    while(sp<=bigger){
        if(arr[sp]<=pivot){
            sp++;
        }else {
            swap(arr[sp],arr[bigger]);
            bigger--;
        }
    }
    swap(arr[p],arr[bigger]); 
    return bigger;
}

 void quicksort(int arr[],int p,int r)//快速排序 递归
{
 if(p<r)
 {
 int q=partition(arr,p,r);
 partition(arr,p,q-1);
 partition(arr,q+1,r);
}
 } 

int main()
{
 
 int arr[]={9,15,27,11,100};

 int len=sizeof(arr)/sizeof(arr[0]);
  

 quicksort(arr,0,len-1);
 for(int i=0;i<len;i++){
     printf("%d,",arr[i]);
 }
 
 return 0;
 
 } 

```

运行结果及报错内容

他会把9替换成0???
结果是0.5.11.27.100

我的解答思路和尝试过的方法
我想要达到的结果

你29行貌似会有q-1<p的情况,试试在partition函数里面加一个判断,p<r再执行