首页 > 试题广场 >

排序次数

[编程题]排序次数
  • 热度指数:1515 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
小摩有一个N个数的数组,他想将数组从小到大 排好序,但是萌萌的小摩只会下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置。
问最少操作多少次可以使得数组从小到大有序?

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


输出描述:
输出一行操作数
示例1

输入

4
19 7 8 25

输出

2

说明

19放到最后,25放到最后,两步完成从小到大排序
# 解题思路:
# 首先将a排序,变为b
# 然后查看a中有多少是按照b中由小到大的顺序排列的
# 举例:a=[1,5,2,6,3,7,4] b=[1,2,3,4,5,6,7]
# 这时a中 1 2 3 4 为按照b中由小到大排序
# 若要将a变为b,只需依次移动5 6 7 到数列的末尾
num=int(input())
a=list(map(int,input().split()))
b=sorted(a)
j=0  count=0 for i in range(len(a)):  if a[i] == b[j]:
        j+=1    count+=1  print(len(b)-count)


发表于 2018-11-19 17:47:23 回复(0)
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        while(scan.hasNext()){
            int n=scan.nextInt();
            int[]data=new int[n];
            for(int i=0;i<n;i++)
                data[i]=scan.nextInt();
            System.out.println(get(data));
        }
    }
    public static int get(int[]data){
        int[] copy=new int[data.length];
        System.arraycopy(data,0,copy,0,data.length);
       Arrays.sort(copy);
       int n=data.length;
       int max=0;
       int i=0;
       int j=0;
       for(;i<n&&j<n;){
           if(data[i]!=copy[j]){
               i++;
           }else{
               i++;
               j++;
           }
       }
        return n-j;
    }
}

发表于 2019-04-16 18:56:08 回复(0)
n=int(raw_input())
a=map(int,raw_input().strip().split(' '))
b=sorted(a)
num,j=0,0 for i in range(len(b)): if b[j]==a[i]:
        j,num=j+1,num+1  print len(b)-num
发表于 2018-07-26 15:09:32 回复(0)
n=input()
a=map(int,raw_input().split())
l=0
for i in range(n):
    if a[n-1] < a[i]:
        l += 1
print(l)

发表于 2018-08-07 16:47:32 回复(2)
O(n)时间复杂度,找到最小的元素,遍历后面的元素即可!
本来就是解决排序的问题,你来个先排序再处理有点画蛇添足了。
不需要对原数组排序,只需要找到原数组最小的元素后面有多少个顺序元素的数量即可。
因为最小的元素后面的顺序元素不需要额外操作来排序,所以其余的元素都是要额外操作来排序的。
def solve(num):
    x = num.index(min(num))
    stack = [num[x]]
    while x<len(num):
        if num[x]>=stack[-1]:
            stack.append(num[x])
        x += 1
    return len(num)-len(stack)+1
if __name__=='__main__':
    n = int(raw_input().strip())
    num = list(map(int,raw_input().split()))
    print(solve(num))


编辑于 2019-09-12 16:37:05 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

/**
 * @author wylu
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] strs = br.readLine().split(" ");
        int[] a = new int[n];
        int[] b = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = Integer.parseInt(strs[i]);
            b[i] = a[i];
        }

        Arrays.sort(b);
        int count = 0;
        for (int i = 0, j = 0; i < a.length; i++) {
            if (a[i] == b[j]) {
                count++;
                j++;
            }
        }
        System.out.println(a.length - count);
    }
}

发表于 2019-01-18 19:12:01 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main()
{
	int z;
	cin >> z;
	vector<int> v1, v2;
	while (z--)
	{
		int x;
		cin >> x;
		v1.push_back(x);
		v2.push_back(x);
	}
	sort(v2.begin(), v2.end());
	int l1 = 0, l2 = 0, index = 0;
	while (l1 < v2.size())
	{
		if (v1[l1] == v2[l2])
		{
			l1++;
			l2++;
			index++;
		}
		else l1++;
	}
	cout << v1.size() - index;
}

发表于 2020-04-28 15:05:49 回复(0)
//思路:首先判断是否是arr[k,-1]的min?如果是,则k+1,如果不是,则arr.splice(k,1),arr.push(arr[k]),num+1;
var n=parseInt(readline());//数量
var arr=readline().split(' ').map(Number);//数字数组
var o_arr=arr.slice();//深拷贝
var sum=0;//改变次数
//排序(选择排序)
for(var i=0;i<n;i++){
    var i_min=arr[i];
    var index=null;
    for(var j=i+1;j<n;j++){
        if(arr[j]<i_min){
            i_min=arr[j];//记录当前最小值
            index=j;
        }
    }
    //交换数据
    if(index!=null){
        var tem=arr[index];
        arr[index]=arr[i];
        arr[i]=tem;
    }
}
for(var i=0;i<n-1;i++){
    // 如果最小值在次小值右边则改变,注意是lastIndexOf,因为存在同值数字
    if(arr[i]!=arr[i+1]&&o_arr.lastIndexOf(arr[i])>o_arr.indexOf(arr[i+1])){
        sum++;//次数加一
        o_arr.push(arr[i+1]);//添加
        o_arr.splice(o_arr.indexOf(arr[i+1]),1);//删除
    }
}
print(sum);
发表于 2020-01-14 23:24:35 回复(0)
import java.util.*;

public clas***ain{
    public static void main(String[] arg***r />         Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int []a=new int [n];
        for(int i=0;i<n;i++){
            a[i]=sc.nextInt();
        }
            int flag=0;
            int temp=0;
            for(int i=1;i<n;i++){
                if(a[i]<a[i-1]){
                    flag++;
                    temp=a[i];
                    a[i]=a[i-1];
                    a[i-1]=temp;
                }
            }
        System.out.println(flag);
    }
}
发表于 2019-05-21 10:23:51 回复(0)
num=int(input())
a=list(map(int,input().split()))
b=sorted(a)
j=0
count=0
for i in range(len(b)):
    if b[j]==a[i]:
        j+=1
        count+=1
print(len(b)-count)


发表于 2018-09-20 15:59:45 回复(0)
import sys

n = int(sys.stdin.readline().strip())
a = list(map(int,sys.stdin.readline().strip().split()))
count = 0
for i in range(len(a)):
         if(a[i]> a[-1]):
             count += 1        
print(count)

发表于 2018-09-05 14:08:29 回复(0)

选择排序吗

发表于 2018-08-03 10:44:29 回复(0)
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){     int n;     cin>>n;     vector<pair<int,int>>arr;     int k=0;     while(n!=0){         int curnum;         cin>>curnum;         arr.push_back(make_pair(curnum,k++));         --n;     }     sort(arr.begin(),arr.end());     int count=1;     while(n+1<arr.size()&&arr[n+1].second>arr[n].second){         count++;         ++n;     }     cout<<arr.size()-count;     return 0; }
发表于 2018-07-24 14:03:38 回复(0)
WAK头像 WAK
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        vector<int> vec;
        for(int i = 0;i<n;i++){
            int x;
            cin>>x;
            vec.push_back(x);
        }
        vector<int> temp = vec;
        sort(temp.begin(),temp.end());
        int a = 0;
        int b = 0;
        int num = 0;
        while(a<vec.size()){
            if(vec[a]==temp[b]){
                a++;
                b++;
                num++;
            }
            else{
                a++;
            }
        }
        cout<<n-num<<endl;
    }
    return 0;
}
发表于 2018-07-18 17:28:11 回复(0)