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; }
截图如下:
原文:http://www.cnblogs.com/audi-car/p/4611686.html