快速排序与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为边界,分离出左数组与右数组,递归执行上面的操作,最终得出排列好的数组
示例代码
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 调试指定程序
start 启动调试 相当于debug按钮 启动后程序停在main的下一行
list 显示当前程序执行行的上5行与下5行 共10行的程序代码
break+line 在指定行设置断点
countine 程序运行到下一个断点位置 相当于F5
next 单步调试 相当于F10 黄色圈圈是程序printf输出 下一行为当前程序执行的位置
step 单步调试 与next的区别是会进入子函数 相当于F11 并显示函数传入的参数
disp+var 监控指定变量 每个变量左侧都会有一个唯一的ID号 使用undisp id删除
finish 退出子函数 相当于shift F11
detach 脱离gdb线程 结束调试
quit 退出gdb
以上是关于快速排序与GDB调试的主要内容,如果未能解决你的问题,请参考以下文章