数据结构 THU2018 - 向量

1. 二分查找

在这里插入图片描述

int binary_search(int*A,int target,int low, int high){
    
    
    if(low > high){
    
    
        return -1;
    }
    int middle = (low+high)/2;
    if(A[middle] == target)
        return middle;
    if(A[middle]<target){
    
    
        return binary_search(A,target,middle+1,high);
    }
    if(A[middle]>target){
    
    
        return binary_search(A,target,0,middle);
    }
}

2. 排序

2.1 冒泡排序(bubble sort)

在这里插入图片描述

auto bubbleSort(int* arr, int low, int high){
    
    
    int pointer_i = high; //一个指针从右往左移动
    int pointer_j = low; //一个指针从左往右移动
    while(pointer_i >= low){
    
    
        for(pointer_j = low; pointer_j <= pointer_i; pointer_j++){
    
    
            if(arr[pointer_j]>arr[pointer_j+1]){
    
     //逆序
                int tmp = arr[pointer_j];
                arr[pointer_j] = arr[pointer_j+1];
                arr[pointer_j+1] = tmp;
            }
        }
        pointer_i--;
    }
}

2.2 归并排序(merge sort)

整体框架:
在这里插入图片描述

auto MergeSort(int* arr, int low, int high){
    
    
    if(low >= high){
    
     //单元素或无元素区间必定有序
        return;
    }
    int middle = (low + high)/2;
    MergeSort(arr, low, middle); //左边有序
    MergeSort(arr, middle+1, high); //右边有序
    Merge(arr, low, middle, high); //将左右两个有序向量合并成一个有序向量
}

合并两个有序向量的函数Merge:
在这里插入图片描述

void Merge(int * arr, int low, int middle, int high){
    
    
    int* buffer = new int[high - low + 1]; //需要开辟新的空间
    int left_ptr = low; //左边向量的开始
    int right_ptr = middle+1; //右边向量的开始
    int buffer_ptr = 0;
    while(buffer_ptr<=high-low) {
    
    
        if (left_ptr > middle) {
    
     //左边向量已经空了,就把右边向量一股脑塞到buffer中
            for (; right_ptr <= high; right_ptr++) {
    
    
                buffer[buffer_ptr] = arr[right_ptr];
                buffer_ptr++;
            }
            continue;
        }
        if (right_ptr > high) {
    
    
            for (; left_ptr <= middle; left_ptr++) {
    
    
                buffer[buffer_ptr] = arr[left_ptr];
                buffer_ptr++;
            }
            continue;
        }

        if (arr[left_ptr] < arr[right_ptr]) {
    
    
            buffer[buffer_ptr] = arr[left_ptr];
            left_ptr++;
            buffer_ptr++;
        }
        if(arr[right_ptr] < arr[left_ptr]){
    
    
            buffer[buffer_ptr] = arr[right_ptr];
            right_ptr++;
            buffer_ptr++;
        }
    }
}

2.3 插入排序

序列总能视作两部分:前一部分有序,后一部分无序。
对于一个candidate e,需要找到它在前面那个有序的序列中应该排在什么位置,然后插入其中。值得注意的是,由于向量这个数据结构天然不适合“插入”,所以还是列表更适合做插入排序。
在这里插入图片描述

2.4 选择排序

在这里插入图片描述

void selection_sort(int*arr, int low, int high){
    
    
    if(high < low)
        return;
    int mmax = -INT32_MAX;
    int max_pos = -1;
    for(int i = low; i<=high ; i++){
    
    
        if(arr[i] > mmax){
    
    
            max_pos = i;
            mmax = arr[i];
        }
    }//找到了无序区间最大的元素位置max_pos
    swap(arr[max_pos], arr[high]);
    //减而治之
    selection_sort(arr, low, high-1);

}

猜你喜欢

转载自blog.csdn.net/weixin_41332009/article/details/114639316