通过交换指针对字符数组进行排序,C++

Sorting char arrays by swapping pointers, C++

本文关键字:排序 C++ 数组 字符 交换 指针      更新时间:2023-10-16

我正在尝试通过交换指针对字符指针数组(char * _string)进行排序。

有这个方法,我想做的是使用我从_string获得的值,并通过不操作_string而是操作空的帮助程序数组(char * _output)来对它们进行排序,我也将其交给该方法。

谁能帮助我,告诉我我做错了什么?

void sortAsc(char* _string, char* _output) 
{
    int length = strlen(_string);
        // output and string now point to the same area in the memory
    _output = _string; 
    for( int i = 0; i < length; i++) {
          for( int j = 0; j < length; j++) {
                if( *(_output) > (_output[j] ) ) {
                    // save the pointer
                    char* tmp = _output;
                    // now output points to the smaller value   
                    _output = _output+j; 
                    // move up the pointer to the smaller value
                    _output + j; 
                    // now the pointer of the smaller value points to the higher value
                    _output = tmp; 
                    // move down to where we were + 1
                    _output - j + 1; 
            }
        }
    }
    //_output[length]='';
    //delete chars;
 }

在我的主方法中,我做了这样的事情:

char * string = {"bcdae"};
char * output = new char[5];
sortAsc(string, output);

在该代码之后,我希望输出数组包含排序的值。

让我们使用指针符号对 10 大小的 int 数组进行选择排序,您可以简单地将其更改为数组列表。

      *---*---*---*---*---* ........
a[] = | 1 | 2 | 4 | 0 | 3 | ........
      *---*---*---*---*---* ........
        ^--------We start here looking for the smaller numbers and sort the array.

for( i = 0; i < 10; i++ ){
    k = i;
    bypass = *( a + i );
    for( j = i + 1; j < 10; j++ ){
        /* To get Increasing order. */
        if( bypass > *( a + j ) ){
           bypass = *( a + j );
           k = j;
        }
    }
    if ( k != i ){
         *( a + k ) = *( a + i );
         *( a + i ) = bypass;
    }
}

这会将字符串排序到已分配的缓冲区中,如果缓冲区不够大,则告诉您它必须有多大:

std::size_t sortAsc(char const* string, char* dest, std::size_t dest_length) {
  std::size_t str_length = strlen(string);
  char const* str_end = string + str_length;
  if (dest_length < str_length+1)
    return str_length+1;
  std::copy( string, str_end, output );
  output[str_length] = '';
  std::sort( output, output+strlen(output) );
  return str_length+1;
}

这使用上面的实现来做糟糕的"分配新字符串"模式:

char* allocate_and_sortAsc(char const* string) {
  std::size_t str_length = strlen(string);
  char* retval = new char[str_length+1];
  std::size_t count = sortAsc( string, retval, str_length+1);
  ASSERT( count <= str_length );
  return retval;
}

并且不要使用以_开头的变量名称,这是一种不好的做法,因为它非常靠近编译器保留名称。 _Capital到处都是保留的,_lower在全球范围内,foo__bar无处不在。