C语⾔史上最详细快速排序图解,让⼩⽩也能轻松理解
快速排序可以看作是冒泡排序的⼀种升级版,优点就是快速,但是稳定性差。
因为是史上最详细快速排序,所以我写的⾮常细~~基本每⼀句代码都解释+图解到位了,需要耐⼼浏览。
sql数据库服务启动不了快速排序的功能概括就是在数组中选定⼀个key值,把⼩于key的数放在左边,⼤于key的数放到右边,再对key左边和右边的数分别再选⼀个key值进⾏重复操作。
先上代码,再对代码进⾏图解,⼤家也可以先把代码跑⼀遍,有个底…
//快速排序
void my_sort(int arr[],int low,int high)
{
//递归结束条件
if(low >= high)
return;
//记录数组第⼀个值和最后⼀个值
int left = low, right = high;
//这⾥我们把第⼀个数选作中⼼值
int key = arr[left];
while(left < right)
{
while(left < right && arr[right]>= key)
{
right--;
}
arr[left]= arr[right];
while(left < right && arr[left]<= key)
{
left++;
}
arr[right]= arr[left];
}
arr[right]= key;
my_sort(arr, low, left -1);
my_sort(arr, left +1, high);
}
int main(int argc, char *argv[])
{
int arr[10]={2,8,6,1,4,3,9,0,7,5};
int len =sizeof(arr)/sizeof(arr[0]);
my_sort(arr,0, len-1);
for(int i =0; i <10; i++)
{
cout << arr[i]<<" ";
}
cout << endl;
system("pause");
return0;
}
代码很少,但是得理解到位
函数三个参数void my_sort(int arr[],int low,int high)
//int arr[] 数组⾸地址
冒泡排序代码c语言//int low 数组第⼀个元素位置
//int hight 数组最后⼀个元素位置
回溯上⾯代码
第⼀步
flex自学教程记录数组第⼀个位置(low)和最后⼀个位置(high)。
int left = low, right = high;
第⼆步
选取⼀个值作为中⼼值,保存在key中,这⾥我们选第⼀个值
int key = arr[left];
此时我们可以看作数组的第⼀个位置是空出来的(第⼀个位置的值已经保存到key中了,不⽤慌~),等待⼀个从右边数起⼩于key的值填到第⼀个位置来。
第三步
从最右边right开始,⼀个⼩于key的数,到了便填到空出的位置上(即是left⽬前所以在的位置),如果不到说明右边所有的数都⽐key⼤,则跳出循环,写代码,当left<right⽽且arr[right] >= key时,right⼀直往左边移动
while(left < right && arr[right]>= key)
{
right--;
}
arr[left]= arr[right];
显然从right开始起,5和7都⽐2⼤,当right移动这个0位置上,while (left < right && arr[right] >= key)这个条件不满⾜了,于是跳出循环,执⾏arr[left] = arr[right];如图,把0拷贝到了第⼀个位置
php高级进阶此时数组时这个样⼦的
那么接下来该做什么呢,现在我们知道右边right位置上空出来了,所以我们需要从左边起,
第四步
从left开始第⼀个⼤于key的数,填到右边去,于是写出代码,当left<right⽽且arr[left]<=key时,left⼀直往右移动。
while(left < right && arr[left]<= key)
{
left++;
}
arr[right]= arr[left];
从右边起,第⼀个位置上的数已经变成了0,⼩于key(2),left++,当left移动到8位置上,发现⼤于key(2),所以while (left <react副作用需要清除吗
right && arr[left] <= key)条件不满⾜了 ,跳出循环执⾏arr[right] = arr[left];如图所⽰
此时数组变成这样
左边⼜空出来,所以⼤家应该知道⼜得从右边right当前位置接着开始⼀个⼩于key(2)的数填到左边空出来的位置上,所有是重复上⾯
的第三步,当第三步中把左边的数拷贝到右边时,⼜得重复第四步,于是有
第五步
我们把第三步和第四步的代码再⽤⼀个whille循环包起来就有如下代码
while(left < right)
{
while(left < right && arr[right]>= key)
{
right--;
}
arr[left]= arr[right];
while(left < right && arr[left]<= key)
{
left++;
}
arr[right]= arr[left];
}
可能有⼈会想为什么while中的条件是left < right,因为left是从左边最⼩的位置开始遍历,right是从右边最⼤的位置开始遍历,当
left=right时,说明到了同⼀个数了,已经把所有的数都对⽐过了,所以此时循环结束。
好了,再结合第⼀步和第⼆步,我们的代码就写到这了
void my_sort(int arr[],int low,int high)
{
//第⼀步
int left = low, right = high;
//第⼆步
int key = arr[left];
//第五步
while(left < right)
{
//第三步
while(left < right && arr[right]>= key)
正态曲线直方图怎么看{
right--;
}
arr[left]= arr[right];
//第四步
while(left < right && arr[left]<= key)
{
left++;
}
arr[right]= arr[left];
}
}
于是在第五步循环中再执⾏第三步的操作,从right开始到1的位置是⼩于key的
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论