上面是核心代码和一个随手写的简单测试,注意看数字15,左边都比15小,右边都比15大。
你的这个题目其实就是快速排序算法的一部分,有兴趣可以去看看快排的原理,我这个函数就是从之前写的快排拿出来小改了一下的。
下面是完整的测试函数,随手写的,可能不太优雅:
#include
using namespace std;
void halfSort(int* v, int low, int high, int k) {
int mid = k, i = low, j = high;
while (true) {
while (v[j] > v[mid] && j != i) {
--j;
}
while (v[i] <= v[mid] && j != i) {
++i;
}
if (j != i) {
v[j] += v[i];
v[i] = v[j] - v[i];
v[j] -= v[i];
} else {
int temp = v[j];
v[j] = v[mid];
v[mid] = temp;
mid = j;
break;
}
}
}
int main(void) {
int arr[45];
for (int i = 0; i < 45; ++i) {
arr[i] = 45 - i;
}
int k = 30;
printf("k = %d, arr[k] = %d\n", k, arr[k]);
halfSort(arr, 0, 44, k);
for (int i = 0; i < 45; ++i) {
printf("%d ", arr[i]);
}
return 0;
}
#include
#include
#include
#define N 20
int main()
{
int s[N];
srand((unsigned)time(0));
int i,j;
for(i=0;i{
s[i]=rand()%200;
}
printf("\n源表\n");
for(i=0;i{
printf("%d ",s[i]);
}
int left_i=0, right_i=N-2;
while(1)
{
if(s[left_i]>s[N-1])
{
while(1)
{
if(s[right_i]{
printf("\n-->\n");
for(i=0;i{
printf("%d",s[i]);
if(i==left_i || i==right_i)
{
printf("^");
}
else
{
printf(" ");
}
}
j=s[left_i];
s[left_i]=s[right_i];
s[right_i]=j;
right_i--;
break;
}
else
{
right_i--;
if(right_i<=left_i)
{
break;
}
}
}
}
left_i++;
if(right_i<=left_i)
{
break;
}
}
printf("\n现表\n");
for(i=0;i{
printf("%d ",s[i]);
}
return 0;
}