else 
        for(int i=left;i<=right;i++){
        Swap(a,a[left],a[i]);//这里标记为1状态
        perm(a,left+1,right);//这里标记为2状态,这里典型的下标越界
        Swap(a,a[left],a[i]);//这里标记为3状态
        }
你的本意是想将数组中的值进行交换是吧?但是for循环执行状态1,这里就成了 m=a[left],
n=a[i],然后再进行交换item=a[m]=a[a[left]]这里就明显有问题了,不是你想要交换的数组的值了
这是将数值的下标值和数组的值进行交换了,数组的值最大为9,明显超出了这个数组的下标值,
所以会出现下标越界
我把以上改成这样 就能运行了
else
for (int i = left; i <= right; i++) {
Swap(a, left, i);
perm(a, left + 1, right);
Swap(a, left, i);
}

解决方案 »

  1.   


    for(int i=left;i<=right;i++){
            Swap(a,a[left],a[i]);
            perm(a,left+1,right);
            Swap(a,a[left],a[i]);
            }

    当i为数组最后一个数时,此时的a[i] = 9; 而你此时传到这个方法

    Swap(int a[],int m,int n)
    时,n就成为9了,而你a[m]=a[n];,此时a[9]不就下标越界了吗,肯定会报数组下标越界异常啊。
    你就直接传下标吧,不要传下标取的数了。
    你把你的数组换成乱序的大一点的随机数,自己想一下就清楚了。