[剑指Offer]排序算法总结

排序

Posted by JinFei on March 1, 2020

快速排序

void QuickSort(vector<int>& data, int begin, int end){
    if(begin < end){
        int pivot = parition(data, begin, end);
        QuickSort(data, begin, pivot - 1);
        QucikSort(data, pivot + 1, end);
    }
}
void parition(vector<int>& data, int begin, int end){
    int pivot = data[begin];
    while(begin < end){
        while(begin < end && data[end] > pivot){
            end--;
        }
        data[begin] = data[end];
        while(begin < end && data[begin] < pivot){
            begin++;
        }
        data[end] = data[begin];
    }
    data[begin] = pivot;
    return pivot;
}

归并排序

void MergeSort(vector<int>& data, vector<int>& temp, int begin, int end){
    if(begin < end){
        int mid = (begin + end) / 2;
        MergeSort(data, temp, begin, mid);
        MergeSort(data, temp, mid + 1, end);
        Merge(data, temp, begin, mid, end);
    }
}
void Merge(vector<int>& data, vector<int>& temp, int begin, int mid, int end){
    int i = begin;
    int j = mid + 1;
    int k = 0;
    while(i <= mid && j <= end){
        if(data[i] < data[j]){
            temp[k++] = data[i++];
        }else{
            temp[k++] = data[j++];
        }
    }
    while(i <= mid){
        temp[k++] = data[i++];
    }
    while(j <= mid){
        temp[k++] = data[j++];
    }
    k = 0;
    while(begin <= end){
        data[begin++] = temp[k++];
    }
}

堆排序

void heapSort(vector<int>& data){
    int size = data.size();
    for(int i = size / 2 - 1; i >= 0; i--){
        adjustHeap(data, i, size);
    }
    for(int i = size - 1; i > 0; i--){
        swap(data[0], data[i]);
        adjustHeap(data, 0, i);     // 从0开始 重新对堆进行排序
    }
}
// 从i的位置 往下查找 有没有比这个位置大的 如果有 就记录下来 最后替换
void adjustHeap(vector<int>& data, int i, int length){
    int temp = data[i];
    for(int k = 2 * i + 1; k < length; k = 2 * k + 1){
        if(k + 1 < length && data[k] < data[k + 1]){
            k++;
        }
        if(data[k] > temp){ // 从下面找一个最大的
            datat[i] = data[k];
            i = k;
        }else{
            break;
        }
    }
    data[i] = temp;
}

希尔排序

void Sort(vector<int>& data){
    int size = data.size();
    // 增量gap,并逐步缩小增量
    for(int gap = size / 2; gap > 0; gap--){
        // 从第gap个元素,逐个对其所在组进行插入排序操作
        for(int i = gap; i < size; i++){
            int j = i;
            while(j - gap >= 0 && array[j] < array[j - gap]){   // 对同组的元素 采用插入排序
                swap(data[j], data[j - gap]);
                j -= gap;
            }
        }
    }
}