快速排序与GDB调试

Posted JanJanPlay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序与GDB调试相关的知识,希望对你有一定的参考价值。

基本思路

算法中常将速度列为非常重要的一个指标,排序算法中的快速排序也因为它的快而得名。而快速排序采用的是分而治之的思想,过程如下:


  • 有一组9个元素的数组(arr),取左边第0号元素(5)作为中轴元素,并设立哨兵(sentinel)i指向0号元素(i=0),哨兵j指向最后一号元素(j=8)

  • 哨兵j先行启动,与arr[0]进行比较。规定如果比中轴元素小的数要放在左边,比中轴元素大的数放在右边,如图5>4,交换arr[0]与arr[8]

  • 规定如果哨兵j指向的元素已经与哨兵i指向的元素发生过交换,则j停止移动,切换为哨兵i启动,此时i=0,指向的元素4<5,符合左边元素比中轴元素小的原则,因此跳过,i+1,arr[1]>arr[8](6>5),因此再次交换两元素的值

  • 重复以上步骤,最终中轴元素5跑到了数组arr的中间位置,在中轴元素的左侧元素都比5小,在中轴元素右侧的都比5大

  • 以中轴元素5为边界,分离出左数组与右数组,递归执行上面的操作,最终得出排列好的数组



示例代码

#include "stdio.h"
void PrintArr(int arr[],int left,int right, const char *begin=NULL, const char *end=NULL){ if(begin) printf("%s\n",begin); for(int i=left;i<right;i++) printf("%d ",arr[i]); printf("\n"); if(end) printf("%s\n",end);}
void Swap(int &a,int &b){ int temp = a; a = b; b = temp;}
int Partition(int arr[],int left,int right){ int i = left,j = right; bool change = false; int ref = arr[i];
while(j>i){ while(arr[j]>=ref) j--; if(j>i){ Swap(arr[i],arr[j]); change = true; } else break;
while(arr[i]<=ref) i++; if(j>i){ Swap(arr[i],arr[j]); change = true; } } if(change) PrintArr(arr,left,right+1); return i;}
void QuickSort(int arr[],int left,int right){ int i=left,j=right; int ref; if(right>left){ ref = Partition(arr,i,j);
QuickSort(arr,left,ref-1); QuickSort(arr,ref+1,right); }}
int main(int argc,char *argv[]){ int arr[] = {5,6,7,8,9,1,2,3,4}; int length = sizeof(arr)/sizeof(arr[0]);
PrintArr(arr,0,length,"Start:","Process:"); QuickSort(arr,0,length-1); PrintArr(arr,0,length,"Result:"); return 0;}


GDB命令与调试过程

  • gdb+program 调试指定程序

    快速排序与GDB调试

  • start 启动调试 相当于debug按钮 启动后程序停在main的下一行

    快速排序与GDB调试

  • list 显示当前程序执行行的上5行与下5行 共10行的程序代码

    快速排序与GDB调试

  • break+line 在指定行设置断点

    快速排序与GDB调试

  • countine 程序运行到下一个断点位置 相当于F5

    快速排序与GDB调试

  • next 单步调试 相当于F10 黄色圈圈是程序printf输出 下一行为当前程序执行的位置

    快速排序与GDB调试

  • step 单步调试 与next的区别是会进入子函数 相当于F11 并显示函数传入的参数

    快速排序与GDB调试

  • disp+var 监控指定变量 每个变量左侧都会有一个唯一的ID号 使用undisp id删除

  • finish 退出子函数 相当于shift F11

  • detach 脱离gdb线程 结束调试

  • quit 退出gdb


以上是关于快速排序与GDB调试的主要内容,如果未能解决你的问题,请参考以下文章

OpenHarmony标准系统实践之GDB调试

GDB代码调试与使用

GDB调试技巧:常用命令

Linux之GDB调试介绍与应用20170601

如何包含 GDB 调试符号“破坏包”?

gdb调试用命令与一般调试方法