有趣的排序

度度熊有一个N个数的数组,他想将数组从小到大 排好序,但是萌萌的度度熊只会下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置。
问最少操作多少次可以使得数组从小到大有序? 

输入描述:
首先输入一个正整数N,接下来的一行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000)



输出描述:
输出一个整数表示最少的操作次数。

 

输入例子1:
4
19 7 8 25

 

输出例子1:
2

思路:

  首先,对于一个长度为size的数组而言,最多调整size-1下即可有序,即每次把倒数第二小的数依次放到后面,那么什么情况下调整的次数会小于size-1下呢?即数组局部有序,比如例子:19,7,8,25。7后面是8,故8不用调整,总调整次数为4-2=2下。再如例子:4,5,1,6,7,2,8,9,3,10,11。数字1,2,3已经是局部有序的了,故不用调整,调整次数为11-3=8下。

  可总结如下规律:先找出数组中最小的数字,记下其位置index,从index往后找,看连续有多少个数字已经局部有序,假设有count个数字已经局部有序,则最后调整的次数为size-count

  代码如下:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<vector>
 4 using namespace std;
 5 int main()
 6 {
 7     int N;
 8     while(cin>>N)
 9     {
10         if(N<=1)cout<<0<<endl;
11         vector<int> arr;
12         while(N--)
13         {
14             int tmp;
15             cin>>tmp;
16             arr.push_back(tmp);
17         }
18         int min=arr[0];
19         int idx=0;
20         for(int i=1; i<arr.size(); ++i)
21         {
22             if(arr[i]<min)
23             {
24                 min=arr[i];
25                 idx=i;
26             }
27         }
28         vector<int> tmp=arr;
29         std::sort(tmp.begin(), tmp.end());//辅助数组排序
30         int k=0;
31         int count=0;
32         for(int i=idx; i<arr.size(); ++i)//从最小值的下标开始往后找
33         {
34             if(arr[i]==tmp[k])
35             {
36                 ++count;
37                 ++k;
38             }
39         }
40         cout<<arr.size()-count<<endl;
41     }
42 }

 

posted @ 2018-03-12 12:02  jeysin  阅读(430)  评论(0编辑  收藏  举报