数据结构研究之一 排序

一、理论摘要

1.编程时要考虑极端情况,保证程序在任况情况下都能正常运行
2.可以参考其他用户公开的源代码提高自己的实力
3.注册一个在线评测的网站
4.算法是运算法则,就是“达到某种目的的步骤”。
5.运算效率和内存使用量是算法选择最重要的标准。
6.时间复杂度是和空间复杂度是时评估的标准。
7.插入排序:只把数列中比当前数据大的,向后移动(与当前值交换位置)。其优势在于能处理相对有序的数据。
8.冒泡排序:两两交换,得到最小的放最前面。然后将次小的放在第二个上。然后依次执行此过程即可排序
9.选择排序:将未排序部分中的最小值与未排序部分中的首元素交换
10.插入排序,冒泡排序和选择排序的比较:
简单冒泡排序法和选择排序法不依赖数据,但插入排序依赖数据,所以插入排序在处理某些数据时具有很高的效率。
11.能时常保证稳定输出的排序算法称为稳定排序算法。

二、实践

1.

//外汇问题
#include <iostream>
#include <algorithm>
using namespace std;
static const int MAX = 200000;

int main() {
    // int R[MAX],n;

//    cin >> n;
//    for ( int i = 0 ; i < n ; i ++ ) cin >> R[i];
    int n = 6;
    int R[6] = {5,3,1,3,4,3};

    int maxv = -20000000;
    int minv = R[0];

    for ( int i = 1 ; i < n ; i ++){
        maxv = max(maxv,R[i]-minv);
        minv = min(minv,R[i]);
        cout<<maxv<<" "<<minv<<" "<<i<<":"<<R[i]<<endl;

    }

    cout << maxv <<endl;
    return 0;
}

 
2.

//插入排序
#include <stdio.h>

void trace(int A[],int N){
    int i;
    for(i = 0 ; i <N ; i ++){
        if ( i > 0 ) printf(" ");
        printf("%d",A[i]);
    }
    printf("\n");
}

void insertionSort(int A[],int N){
    int j,i,v;
    for ( i = 1; i <N; i ++){
        v = A[i];
        j = i - 1;
        while (j >= 0 && A[j] > v){
            A[j+1] = A[j];
            j --;
        }
        A[j+1] = v;
        trace(A,N);
    }
}

int main(){
    int N,i,j;
    int A[100];

    scanf("%d",&N);
    for ( i = 0 ; i < N ; i ++) scanf("%d",&A[i]);

    trace(A,N);
    insertionSort(A,N);

    return 0;
}

3.

//冒泡排序
#include <iostream>
using namespace std;


int bubbleSort(int A[],int N) {
    int sw = 0;
    bool flag = 1;
    for (int i = 0; flag; i++) {
        flag = 0;
        for (int j = N - 1; j >= i + 1; j--) {
            if (A[j] < A[j - 1]) {
                swap(A[j], A[j - 1]);
                flag = 1;
                sw++;
            }
        }
    }
    return sw;
}

int main(){
    int A[100],N,sw;
    cin >> N;
    for ( int i = 0 ; i < N ; i ++) cin>>A[i];

    sw = bubbleSort(A,N);
    for ( int i = 0 ; i < N ; i ++){
        if (i) cout<< " ";
        cout << A[i];
    }
    cout << endl;
    cout << sw <<endl;

    return 0;

}
4.

//选择排序
#include <stdio.h>

int selectionSort(int A[],int N){
    int i,j,t,sw = 0 ,minj;
    for ( i = 0 ; i < N - 1 ; i ++){
        minj = i;
        for ( j = i ; j < N ; j ++){
            if ( A[j] < A[minj] ) minj = j;
        }
        t = A[i];A[i] = A[minj];A[minj] = t;
        if ( i != minj) sw++;
    }
    return sw;
}

int main(){
    int A[100],N,i,sw;

    scanf("%d",&N);
    for ( i = 0 ; i <N ; i ++) scanf("%d",&A[i]);

    sw = selectionSort(A,N);

    for ( i = 0 ; i < N ; i ++){
        if ( i > 0 ) printf(" ");
        printf("%d",A[i]);
    }
    printf("\n");
    printf("%d\n",sw);

    return 0;

}

5.

//判断排序是否稳定
#include <iostream>
using namespace std;

struct Card { char suit,value; };

void bubble(struct Card A[],int N){
    for ( int i = 0 ; i < N ; i ++){
        for (int j = N -1 ; j >=i+1 ; j --){
            if ( A[j].value < A[j-1].value ){
                Card t = A[j];A[j] = A[j-1];A[j-1] = t;
            }
        }
    }
}

void selection (struct Card A[],int N){
    for (int i = 0 ; i < N ; i ++ ) {
        int minj = i ;
        for ( int j = i ; j < N ; j ++){
            if ( A[j].value < A[minj].value ) minj = j;
        }
        Card t = A[i];A[i] = A[minj] ; A[minj] = t;
    }
}

void print (struct Card A[],int N){
    for ( int i = 0 ; i < N ; i ++){
        if ( i > 0 ) cout << " ";
        cout << A[i].suit << A[i].value;
    }
    cout << endl;
}

bool isStable(struct Card C1[],struct Card C2[],int N){
    for ( int i = 0 ; i < N ; i ++){
        if ( C1[i].suit != C2[i].suit ) return false;
    }
    return true;
}

int main(){
    Card C1[100],C2[100];
    int N;
    char ch;

    cin >> N ;
    for ( int i = 0 ; i < N ; i ++){
        cin >> C1[i].suit >> C1[i].value;
    }

    for ( int i = 0 ; i < N ; i ++ ) C2[i] = C1[i];

    bubble(C1,N);
    selection(C2,N);

    print(C1,N);
    cout << "Stable" << endl;
    print(C2,N);
    if ( isStable(C1,C2,N)){
        cout << "Stable" << endl;
    }else {
        cout << "Not stable " <<endl;
    }

    return 0;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值