C排序(种类)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C排序(种类)相关的知识,希望对你有一定的参考价值。
确定函数,以便将所有元素排列在数组中小于给定值的元素将放置在较大元素的左侧比给定值。
例如,如果数组内容为{4,6,2,9,1,7,3,10}并且x为5,则{4,3,2,1,9,7,6,10}是一个可能的解决方案,因为所有小于5的元素都在左侧大于5的元素。
此外,除在主函数中定义数组外,禁止使用方括号[]。
此外,实现一个打印数组内容的函数。这两个功能必须递归实现。您只能访问一次数组的每个元素。
好吧,这是“挑战”,我不知道在给定的限制下是否有可能。我尝试过使用while循环进行转换,然后以某种方式将其转换为递归,但是您也不允许更改参数。有谁知道解决方法。
我写了一些东西,但有垃圾。
#include <stdio.h>
#define length 8
void selection(int array[],int size, int x){
int i=0;
int temp;
if(( array[i]>x ) && (array[i] > array[i+1])){
temp=array[i+1];
array[i+1]=array[i];
array[i]=temp;
i++;
selection(array+1,size-1,x)
}
else if(( array[i] > x) && ( array[i+1] > array[i])){
i++;
}
//This is not correct
}
void printArray(int arr[], int start, int len)
{
if(start >= len)
return;
printf("%d ", arr[start]);
printArray(arr, start + 1, len);
}
int main(){
int array[length]={6,4,2,9,1,7,3,10};
int x=5;
selection(array,length,x);
printArray(array,0,length);
return 0;
}
我还没有实现一个递归解决方案,因为我尝试了一些事情,因为我到达了数组之外,所以一直出现分段错误。
任何人都可以暂时或不重复地进行此操作。我想您需要拆分数组并半看[]
好,以将所有小于给定值的元素放置在大于给定值的元素左侧的位置的方式将元素排列在数组中的函数。]
答案
您在这里。
#include <stdio.h>
void partition( int a[], size_t n, int pivot )
{
if ( !( n < 2 ) )
{
if ( *a < pivot )
{
partition( a + 1, n - 1, pivot );
}
else
{
if ( *( a + n - 1 ) < pivot )
{
int tmp = *a;
*a = *( a + n - 1 );
*( a + n - 1 ) = tmp;
partition( a + 1, n - 2, pivot );
}
else
{
partition( a, n - 1, pivot );
}
}
}
}
int main(void)
{
int a[] = { 4, 6, 2, 9, 1, 7, 3, 10 };
const size_t N = sizeof( a ) / sizeof( *a );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( '
' );
int pivot = 5;
partition( a, N, pivot );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d ", a[i] );
}
putchar( '
' );
return 0;
}
以上是关于C排序(种类)的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段