《算法》第二章——归并排序实现,快速归并,间接(索引)归并
来源:互联网 发布: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
- 《算法》第二章——归并排序实现,快速归并,间接(索引)归并
- 算法导论第二章(归并排序)
- 排序算法(2)—归并排序,快速排序
- 归并排序和快速排序算法实现
- 算法:C++实现快速排序&归并排序
- 排序算法之快速排序、归并排序(java实现)
- 算法导论第二章C++实现归并算法排序
- 排序算法—归并排序
- 排序算法—归并排序
- 归并排序算法实现
- 归并排序算法实现
- 归并排序算法实现
- 归并排序算法实现
- 归并排序算法实现
- 归并排序算法实现
- 算法导论第二章C++实现归并排序
- 【算法导论】第二章之归并排序
- 算法导论第二章-归并排序
- weakSelf用处
- 言行合一,真正以客户需求为中心,市场才会买账我们的产品
- (原创)分享一个自定义的tablayout组件
- 快速排序(C++实现)
- iconFont Access-Control-Allow-Origin
- 《算法》第二章——归并排序实现,快速归并,间接(索引)归并
- softmax回归
- HDU Problem - 1058 Humble Numbers 【dp】
- 如何学习嵌入式系统(基于ARM平台)
- 基于开源dxflib解析库的dxf文件显示
- Save results to different files when executing multi SQL statements in DB Query Analyzer 7.01
- wsacreateevent 事件使用
- Java程序执行过程的内存分析
- 定时向数组前添加不重复随机数