谷歌笔试题——排序,只允许0和其他元素交换

2.2 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序。

这题有一个隐含条件:即数组元素是连续的,即0——n-1,当你排好序后,你会发现数组元素和该元素的下标是相等的。

思路:以数组2 0 3 1为例

1、首先a[0]=2,按照上述条件它应该放在a[2]的位置上。因为只允许0元素和其他元素的交换。所以不能直接交换a[0]和a[2],所以将0元素和a[2]互换,得到2 3 0 1,然后就可以把a[0]=2和a[2]=0互换了,得到0 3 2 1

按照这个思路,实现代码如下:

// Sort_google.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

void swap(int *a,int i,int j)
{
    int temp;
    temp=a[i];
    a[i]=a[j];
    a[j]=temp;
}

int find(int *a,int len)
{
    for (int i=0;i<len;i++)
    {
        if (a[i]==0)
        {
            return i;
        }
    }
}

void sort(int *a,int len)
{
    for (int i=0;i<len;)//注意这里没有i++
    {
        if (a[i]==i)
        {
            i++;    //能够跳出循环就主要看这句话了
            continue;    
        }

        swap(a,find(a,len),a[i]);
        for (int j=0;j<len;j++)
        {
            cout<<a[j]<<"  ";    //这里只是为了输出数组元素  看一下排序后数组的元素值  无实际作用
        }
        cout<<endl;

        swap(a,find(a,len),i);
        for (int j=0;j<len;j++)
        {
            cout<<a[j]<<"  ";    //这里只是为了输出数组元素  看一下排序后数组的元素值  无实际作用
        }
        cout<<endl;

        swap(a,find(a,len),0);    //将0元素换到a[0]的位置上去。
    }
    
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a[]={1,10,9,7,5,2,3,4,0,6,8};//{3,2,0,1};
    int len=sizeof(a)/sizeof(int);
    sort(a,len);
    for (int i=0;i<len;i++)
    {
        cout<<a[i]<<"  ";
    }
    cout<<endl;
    return 0;
}

截图如下:

image

原文地址:https://www.cnblogs.com/audi-car/p/4611686.html