数据排序

                                数据排序


 

1.选择排序

  思想:每次从待排序的数列中选取最小的数,放在序列的最前面。

  例如 :1   [49 38 65 97 78 13 27 49]

      2   13 [38 65 97 76 49 27 49]

      3   13 27 [65 97 76 49 38 49]

                   ...............................................

      7   13 27 38 49 49 65 76 97

上代码

#include<iostream>

#include<cstdio>
using namespace std;
int main()
{
  double a[1000],n;
  cin>>n; //输入n个数
  for(int i=1;i<=n;i++)
  cin>>a[i]; 
  for(int i=1;i<n;i++)        //将n个数排好序需要执行(n-1)次 
  {
  int k=i;          //记录排序次数,第i次确定第i小的数 
    for(int j=i+1;j<=n;j++)   //先假设在剩下的序列中第k个是最小的
       if(a[j]<a[k])            //遇到比第k个数小的数,则记录下它的位        
                                                             //
        k=j;    
  if(k!=i)    
  swap(a[k],a[i]);       //交换a[k]和a[i] 
  }
  for(int i=1;i<=n;i++)
  cout<<a[i]<<" ";      //输出 
  return 0;             //完美收场 
}

 

  2:冒泡排序

    思想:每一次通过比较相邻的两个数据,若是逆序对(从大到小),则交换他们。

       每一次排序选出最大的数放在待排序数列的最后面。

    例如:1.[17 15 36 98 14 21]

       2.[15 17 36 98 14 21]

          3.[15 17 36 98 14 21]

          4.[15 17 36 98 14 21]

          5.[15 17 36 14 98 21]

          6.[15 17 36 14 21] 98

       通过一次冒泡,将最大的数排在了最后。

上代码

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
  double a[1000];
  int n;
  cin>>n;
  for(int i=1;i<=n;i++)
  cin>>a[i];  
  for(int i=1;i<=n-1;i++)                   //i控制次数,排好n个数据,共需要冒泡(n-1)次 
    for(int j=1;j<=n-i;j++)             //相邻两个数据比较 
      if(a[j]>a[j+1])                //若为逆序对 
        swap(a[j],a[j+1]);         //交换 
  for(int i=1;i<=n;i++)    
  cout<<a[i]<<" ";                  //输出 
  return 0;    
}

3.桶排序

  思想:将数据放在对应下标的桶中,按照顺序依次输出。   以空间换时间

  例如:[1 0 6 5 3 1 7 8]

     桶 0 1 2 3 4 5 6 7 8

      数量 1 2 0 1 0 1 1 1 1

        输出 0 1 1 3 5 6 7 8

上代码

 

#include<iostream>
#include<cstdio>
using namespace std;
int a[10000],b[10000000];
int main()
{
  int n,m,i=1;
  cin>>n;
  for(int i=1;i<=n;i++)
  cin>>a[i];
  for(int i=1;i<=n;i++)
  {
  m=a[i];          //将数据放在对应下标的桶里 
  b[m]++;    
  }
  while(i<10000)     //在数据范围内检查 
  {
  if(b[i]!=0)          //若发现不是空桶
  {
  b[i]--;                //桶内数量-1 
  cout<<i<<" ";            //输出

  }
  else i++;              //若为空桶,检查下一个,如果要求相同数据只输出一次,可以去掉else 
  }
  return 0;
 }

 

4.sort排序            个人感觉是最好用的一个

C++中自带的函数,结构为sort(a,a+n,排序函数)  排序函数可以省略,默认为从小到大排序

注:若使用sort排序,需先声明include<algorithm>

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[10000];
bool cmp(int x,int y)
{
    return x<y;                //从小到大排序,若想从大到小,可以改为x<y 
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<=n-1;i++)
    cin>>a[i];
    sort(a,a+n,cmp);
    for(int i=0;i<=n-1;i++)
    cout<<a[i]<<" ";
    return 0; 
 } 

                          2021-02-04

5.快速排序

快速排序是对冒泡排序的优化,运用了二分的思想,但是不稳定,相同的元素可能会改变顺序,但一般影响不是很大。听这就知道这种方法速度很快,时间复杂度On(logn)

看代码

 1 #include<iostream>
 2 using namespace std;
 3 int a[100000000];
 4 void f(int l,int r)
 5 {
 6     int i,j,mid,p;
 7     i=l;j=r;
 8     mid=(l+r)/2;
 9     do{
10         while(a[i]<mid) i++;
11         while(a[j]>mid) j--;
12         if(i<=j)
13         {
14             p=a[i];a[i]=a[j];a[j]=p;
15             i++;j--;
16         }
17     }while(i<=j);
18     if(l<j) f(l,j);
19     if(i<r) f(i,r);
20 }
21 int main()
22 {
23     int n,i;
24     cin>>n;
25     for(i=1;i<=n;i++)
26     cin>>a[i];
27     f(1,n);
28     for(i=1;i<=n;i++)
29     cout<<a[i]<<" ";
30     return 0;
31 }

 6.归并排序

#include<iostream>
#include<cstdio>
using namespace std;
#define de define
long long ans;
int a[1000000],c[1000000];
void msort(int b,int e)
{
    if(b==e) return ;
    int mid=(b+e)/2,i=b,j=mid+1,k=b;
    msort(b,mid);
    msort(mid+1,e);
    while(i<=mid&&j<=e)
    {
        if(a[i]<=a[j])
        c[k++]=a[i++];
        else 
        c[k++]=a[j++],ans+=(mid-i+1) ;
    }
    while(i<=mid)
    c[k++]=a[i++];
    while(j<=e)
    c[k++]=a[j++];
    for(int i=b;i<=e;i++)
    a[i]=c[i];
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    msort(1,n);
    cout<<ans;
}

                                  2021年4月12日11:04:59  加入归并排序,完结

posted @ 2021-02-04 10:20  S_Curry  阅读(210)  评论(1编辑  收藏  举报