简体   繁体   English

如何仅使用一个额外的整数变量对整数列表进行排序?

[英]How do I sort a list of integers using only one additional integer variable?

How to sort list of values using only one variable? 如何仅使用一个变量对值列表进行排序?

EDIT: according to @Igor's comment, I retitled the question. 编辑:根据@ Igor的评论,我重新提出了这个问题。

A solution in C: C中的解决方案:

#include <stdio.h>

int main()
{
    int list[]={4,7,2,4,1,10,3};
    int n;  // the one int variable

    startsort:
    for (n=0; n< sizeof(list)/sizeof(int)-1; ++n)
        if (list[n] > list[n+1]) {
            list[n] ^= list[n+1];
            list[n+1] ^= list[n];
            list[n] ^= list[n+1];
            goto startsort;
        }

    for (n=0; n< sizeof(list)/sizeof(int); ++n)
        printf("%d\n",list[n]);
    return 0;
}

Output is of course the same as for the Icon program. 输出当然与Icon程序相同。

I suspect I'm doing your homework for you, but hey it's an interesting challenge. 我怀疑我正在为你做功课,但嘿,这是一个有趣的挑战。 Here's a solution in Icon : 这是Icon的解决方案:

procedure mysort(thelist)
    local n # the one integer variable
    every n := (1 to *thelist & 1 to *thelist-1) do
    if thelist[n] > thelist[n+1] then thelist[n] :=: thelist[n+1]
    return thelist
end

procedure main(args)
    every write(!mysort([4,7,2,4,1,10,3]))
end

The output: 输出:

1
2
3
4
4
7
10

You could generate/write a lot of sorting-networks for each possible list size. 您可以为每个可能的列表大小生成/编写大量排序网络。 Inside the sorting network you use a single variable for the swap operation. 在排序网络中,您使用单个变量进行交换操作。

I wouldn't recommend that you do this in software, but it is possible nevertheless. 我不建议您在软件中执行此操作,但仍然可以。

Here's a sorting-routine for all n up to 4 in C 这是一个排序例程,适用于C中最多4个n

// define a compare and swap macro 
#define order(a,b) if ((a)<(b)) { temp=(a); (a) = (b); (b) = temp; }

static void sort2 (int *data)
// sort-network for two numbers
{
  int temp;
  order (data[0], data[1]);
}

static void sort3 (int *data)
// sort-network for three numbers
{
  int temp;
  order (data[0], data[1]);
  order (data[0], data[2]);
  order (data[1], data[2]);
}

static void sort4 (int *data)
// sort-network for four numbers
{
  int temp;
  order (data[0], data[2]);
  order (data[1], data[3]);
  order (data[0], data[1]);
  order (data[2], data[3]);
  order (data[1], data[2]);
}

void sort (int *data, int n)
{
  switch (n)
    {
    case 0:
    case 1:
      break;
    case 2:
      sort2 (data);
      break;
    case 3:
      sort3 (data);
      break;
    case 4:
      sort4 (data);
      break;
    default:
      // Sorts for n>4 are left as an exercise for the reader
      abort();
    }
}

Obviously you need a sorting-network code for each possible N. 显然,您需要为每个可能的N分类网络代码。

More info here: 更多信息:

http://en.wikipedia.org/wiki/Sorting_network http://en.wikipedia.org/wiki/Sorting_network

In java: 在java中:

import java.util.Arrays;

/**
 * Does a bubble sort without allocating extra memory
 *
 */
public class Sort {
    // Implements bubble sort very inefficiently for CPU but with minimal variable declarations
    public static void sort(int[] array) {
        int index=0;
        while(true) {
            next:
            {
                // Scan for correct sorting. Wasteful, but avoids using a boolean parameter
                for (index=0;index<array.length-1;index++) {
                    if (array[index]>array[index+1]) break next;
                }
                // Array is now correctly sorted
                return;
            }
            // Now swap. We don't need to rescan from the start
            for (;index<array.length-1;index++) {
                if (array[index]>array[index+1]) {
                    // use xor trick to avoid using an extra integer
                    array[index]^=array[index+1];
                    array[index+1]^=array[index];
                    array[index]^=array[index+1];
                }
            }
        }
    }

    public static void main(final String argv[]) {
        int[] array=new int[] {4,7,2,4,1,10,3};
        sort(array);
        System.out.println(Arrays.toString(array));
    }
}

Actually, by using the trick proposed by Nils , you can eliminate even the one remaining int allocation - though of course that would add to the stack instead... 实际上,通过使用Nils提出的技巧,你甚至可以消除剩下的一个int分配 - 当然这会增加堆栈而不是......

红宝石:[1,5,3,7,4,2] .sort

You dont, it is already sorted. 你没有,它已经排序了。 (as the question is vague, I shall assume variable is a synonym for an object) (因为问题含糊不清,我假设变量是对象的同义词)

If you have a list (1 5 3 7 4 2) and a variable v , you can exchange two values of the list, for example the 3 and the 7, by first assigning 3 to v , then assigning 7 to the place of 3, finally assigning the value of v to the original place of 7. After that, you can reuse v for the next exchange. 如果你有一个列表(1 5 3 7 4 2)和一个变量v ,你可以交换列表的两个值,例如3和7,首先将3分配给v ,然后将7分配给3的位置,最后将v的值分配给原始位置7.之后,您可以重复使用v进行下一次交换。 In order to sort, you just need an algorithm that tells which values to exchange. 为了排序,您只需要一个算法来告诉要交换哪些值。 You can look for a suitable algorithm for example at http://en.wikipedia.org/wiki/Sorting_algorithm . 您可以在http://en.wikipedia.org/wiki/Sorting_algorithm中查找合适的算法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM