我这样做,但有些东西显示已经稍微重新排列的阵列。我不明白为什么。或者应该是这样?它仍然有可能实现这个想法?
快速排序的本质是将数组中的元素随机排列,使其分为两部分。第一部分包含小于或等于'p'的元素,第二部分包含大于或等于'p'的元素。然后我们分别对每一部分进行排序。
一般来说,选择“p”使得数组被分成两半是非常可取的。请注意,“p”可以是任何元素(不一定来自数组的中间),甚至不一定来自这个数组。
#include<iostream>
using namespace std;
void funcprint( int arr[], int size )
{
for( int i = 0; i < size; i++ )
cout << arr[i] << " ";
cout << endl;
}
int *ar;
void quickSort( int a[], long N ) {
if( N < 2 )
return;
long i = 0, j = N - 1;
int p = a[N >> 1];
while( i < j ) {
while( a[i] < p ) i++;
while( a[j] > p ) j--;
if( i < j )
swap( a[i++], a[j--] );
}
funcprint( ar, 9 );
quickSort( a, j );
quickSort( a + i, N - i );
}
int main() {
int a[10] = { 1,2,3,4,1,2,6,7,8 };
//int a[10] = { 5,2,1,9,1,4,6,2,0 };
ar = a;
int N = 8;
quickSort( a, N );
funcprint( a, N+1 );
}
字符串
1条答案
按热度按时间tp5buhyn1#
要可视化代码的工作,您可以突出显示在每次迭代中排序的子数组。
字符串
这段代码的输出:
型
对于
int a[10] = { 5,2,1,9,1,4,6,2,0 };
:型
如果你想看到每个交换,你可以使用这种方法:
型
输出量:
型
对于
int a[10] = { 5,2,1,9,1,4,6,2,0 };
:型
这段代码有点乱,只是为了说明一下。