zoukankan      html  css  js  c++  java
  • 【个人】排序练习

    插入排序:

    #include<iostream>
    #include<string.h>
    using namespace std;
    void output(int a[], int n){
     for(int i = 0; i < n; i++) {
      cout<<a[i]<<" ";
     }
     cout<<endl;
    }
    
    int main(){
     int a[105];
     memset(a,0,sizeof(a));
     int n;
     cin>>n;
     for(int i = 0; i < n; i++) {
        cin>>a[i];
     }
     for(int i = 0; i < n; i++) {
      int temp = a[i];
      int j = i - 1;
      while(j >= 0 && a[j] > temp){
       a[j+1] = a[j];
       j--;
      }
      a[j+1] = temp;
      output(a, n);
     }
     return 0;
    }

    插入排序,幻想成是你在抓扑克牌的时候。以i为分割线,i之前的扑克牌都是已经拍好顺序的了。

    所以你需要在i进行插入的时候,和它前面的一个个比较,若前面的要大于它,就覆盖,直到找到一个小于它的数j,就放在这个数的后面。

    插入排序可以高速整理顺序很整齐的数据。

    冒泡排序

    #include<iostream>
    #include<string.h>
    using namespace std;
    void output(int a[], int n){
     for(int i = 0; i < n; i++) {
      cout<<a[i]<<" ";
     }
     cout<<endl;
    }
    
    int main(){
     int a[105];
     memset(a,0,sizeof(a));
     int n;
     int times=0;
     cin>>n;
     for(int i = 0; i < n; i++) {
        cin>>a[i];
     }
     for(int i = 0; i < n; i++) {
      for(int j = n-1; j >= i + 1; j--) {
        if(a[j-1] > a[j]) {
            int temp = a[j];
            a[j] = a[j-1];
            a[j-1] = temp;
            times++;
        }
      }
     }
     output(a, n);
     cout<<times;
     return 0;
    }

    从高处开始,往底层两个两个的判断。就好像泡泡一样把小的往前面送了。一趟完成后,之前未排序部分的第一个肯定是剩下数里最小的。

    选择排序

    #include<iostream>
    #include<string.h>
    using namespace std;
    void output(int a[], int n){
     for(int i = 0; i < n; i++) {
      cout<<a[i]<<" ";
     }
     cout<<endl;
    }
    
    int main(){
     int a[105];
     memset(a,0,sizeof(a));
     int n;
     int times=0;
     cin>>n;
     for(int i = 0; i < n; i++) {
        cin>>a[i];
     }
     for(int i = 0; i < n; i++) {
      int index = i;
      for(int j = i + 1; j < n; j++) {
        if(a[index] > a[j]){
            index = j;
        }
      }
      if(index != i){
        int temp = a[index];
        a[index] = a[i];
        a[i] = temp;
        times++;
      }
     }
     output(a, n);
     cout<<times;
     return 0;
    }

    就是一趟趟地走,每次选择那个最小/大的。

    选择排序不一定是一种稳定的算法。如果最小的那个数字和重复大数字交换排序后,就会出现位置变换了。

    希尔排序

    #include<iostream>
    #include<string.h>
    #include<vector>
    using namespace std;
    void output(int a[], int n){
     for(int i = 0; i < n; i++) {
      cout<<a[i]<<endl;
     }
    }
    
    void insertion(int a[], int n, int g, int &times) {
     for(int i = 0; i < n; i++) {
        int temp = a[i];
        int j = i-g;
        while(j >= 0 && a[j] > temp) {
            a[j+g] = a[j];
            j = j - g;
            times++;
        }
        a[j+g] = temp;
     }
    }
    
    int main(){
     int a[105];
     memset(a,0,sizeof(a));
     int n;
     int times=0;
     cin>>n;
     for(int i = 0; i < n; i++) {
        cin>>a[i];
     }
    
     vector<int> gs;
     for(int h=1;;){
        if(h>n) break;
        gs.push_back(h);
        h = 3*h + 1;
     }
    
     for(int i = gs.size()-1; i >= 0; i--) {
        insertion(a, n, gs[i], times);
     }
    
     cout<<gs.size()<<endl;
     for(int i = gs.size()-1; i >= 0; i--) {
        cout<< gs[i]<<" ";
     }
     cout<<endl;
     cout<<times<<endl;
     output(a, n);
     return 0;
    }

    希尔排序是加工过后的插入排序。

    是按间隔来分别进行插入排序。这个间隔的算法是按照那个复杂度来的吧,这个题的要求是O(N1.25),所以题目用了gn+1=3gn+1;

  • 相关阅读:
    MAC下cocos2dx环境搭建
    eclipse混淆打包出错
    eclipseme升级
    MyEclipse 10 中增加插件
    j2me图片处理大全
    关于svn使用
    NFS相关
    BMP文件格式图解
    UDA1341TS
    OpenOCD初始化脚本(uboot)
  • 原文地址:https://www.cnblogs.com/rimochiko/p/8557744.html
Copyright © 2011-2022 走看看