《算法》第二章——归并排序实现,快速归并,间接(索引)归并

来源:互联网 发布:php 微信扫码支付接口 编辑:程序博客网 时间:2024/05/30 23:55
#include<iostream>#include<algorithm>#define N 5using namespace std;int aux[N];//辅助数组void merge(int a[],int lo,int mid,int hi){//将a[lo..mid]和a[mid+1..hi]归并int i = lo;int j = mid + 1;for (int k = lo; k <=hi; k++)//将a[lo..hi]复制到aux[lo..hi]{aux[k] = a[k];}for (int k=lo; k <=hi; k++)//归并到a[lo..hi]{if (i > mid)a[k] = aux[j++];//左半边用尽(取右半边元素)else if (j > hi)a[k] = aux[i++];//右半边用尽(取左半边元素)else if (aux[i] > aux[j])a[k] = aux[j++];//取左右半边中较小的那个元素elsea[k] = aux[i++];//取左右半边中较小的那个元素}}//自顶向下归并void sort_TopDown(int a[],int lo,int hi){if (lo >= hi)return;int mid = (lo + hi) / 2;sort_TopDown(a, lo, mid);sort_TopDown(a,mid + 1, hi);if (a[mid] > a[mid + 1])//如果a[mid]小于等于a[mid+1]则数组已有序,所以跳过merge操作merge(a, lo, mid, hi);}//自底向上归并void sort_DownTop(int a[]){for (int size = 1; size < N; size+=size){for (int i = 0; i < N - size; i+=size*2){merge(a, i, i + size - 1, min(i + size - 1 + size, N - 1));//因为最后一部分的大小可能小于一个size,此时赢取N-1作为hi值}}}int main(){int a[N];for (int i = 0; i < N; i++)cin >> a[i];sort_TopDown(a, 0, N-1);sort_DownTop(a);for (int i = 0; i < N; i++)cout << a[i] << " ";cout << endl;system("pause");}


快速归并


int aux[N];//快速归并void q_mergesort(int a[],int low,int mid,int high){for (int i = 0; i <= mid; i++){//顺序拷贝前半部分aux[i] = a[i];}for (int i = mid + 1; i <= high; i++){//逆序拷贝后半部分aux[i] = a[high - i + mid + 1];}for (int k = low; k <= high; k++){int i=low, j=high;if (aux[j] < aux[i]){a[k] = aux[j--];}else{a[k] = aux[i++];}}}
因为这种改进算法是两个索引从两边向中间扫描所以即使越界也不会重复扫描。

索引归并


#include<iostream>#define N 5using namespace std;void merge(int a[], int aux[], int index[], int lo, int mid, int hi){for (int i = lo; i <= hi; i++){aux[i] = index[i];}int i = lo;int j = mid+1;for (int k = lo; k <= hi; k++){//这里扫描的是辅助数组aux然后将结果归并到index数组中if (i > mid){index[k] = aux[j++];}else if (j > hi){index[k] = aux[i++];}else if (a[aux[i]] < a[aux[j]]){index[k] = aux[i++];}else{index[k] = aux[j++];}}}void index_sort(int a[],int aux[],int index[],int lo,int hi){if (hi <= lo)return;int mid = (lo + hi) / 2;index_sort(a, aux, index, lo, mid);index_sort(a, aux, index, mid + 1, hi);merge(a, aux, index, lo, mid, hi);}int main(){int a[N];//带排序数组int aux[N];//辅助数组用了存索引int index[N];//索引数组for (int i = 0; i < N; i++){cin >> a[i];index[i] = i;//初始化索引数组使得a[i]=a[index[i]]}index_sort(a, aux, index, 0, N - 1);for (int i = 0; i < N; i++){cout << index[i] << " ";}system("pause");}



0 0
原创粉丝点击