博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法概论】分治算法:数组去重
阅读量:4176 次
发布时间:2019-05-26

本文共 1337 字,大约阅读时间需要 4 分钟。

先进行归并排序,再一项项进行去重。

时间复杂度:O(n*logn)

#include 
using namespace std;void mergeSort(int data[], int head, int tail);void merge(int data[], int head, int mid, int tail);int main(){ int n; cin >> n; int *data = new int[n]; for (int i = 0; i < n; ++i) { cin >> data[i]; } mergeSort(data, 0, n - 1); cout << data[0] << ' '; for (int i = 1; i < n; ++i) { if (data[i] != data[i - 1]) { cout << data[i] << ' '; } } cout << endl; delete data; return 0;}void mergeSort(int data[], int head, int tail){ if (head < tail) { int mid = (head + tail) / 2; mergeSort(data, head, mid); mergeSort(data, mid + 1, tail); merge(data, head, mid, tail); } return;}void merge(int data[], int head, int mid, int tail){ int len1 = mid - head + 1; int len2 = tail - mid; int *L = new int[len1]; int *R = new int[len2]; for (int i = 0, k = head; i < len1; ++i, ++k) { L[i] = data[k]; } for (int j = 0, k = mid+1 ; j < len2; ++j, ++k) { R[j] = data[k]; } int i = 0, j = 0, k = head; while (i < len1 && j < len2) { if (L[i] > R[j]) { data[k] = R[j]; ++j; } else if (L[i] < R[j]) { data[k] = L[i]; ++i; } else { data[k] = L[i]; ++k; data[k] = R[j]; ++i; ++j; } ++k; } if (i == len1) { while (j < len2) { data[k++] = R[j++]; } } if (j == len2) { while (i < len1) { data[k++] = L[i++]; } } delete L; delete R; return;}

 

转载地址:http://yttai.baihongyu.com/

你可能感兴趣的文章
小Q的歌单
查看>>
牛客网 计算机网络 选择题及知识点 (1)
查看>>
0-1背包问题
查看>>
TCP-IP详解卷1:协议 学习笔记(5) RARP ICMP
查看>>
Java核心技术 卷I 基础知识 学习笔记(3)
查看>>
TCP-IP详解卷1:协议 学习笔记(6) Ping
查看>>
Java核心技术 卷I 基础知识 学习笔记(4)
查看>>
Java核心技术 卷I 基础知识 学习笔记(5)
查看>>
Java核心技术 卷I 基础知识 学习笔记(6)
查看>>
微服务架构与实践 学习笔记(1)
查看>>
Java核心技术 卷I 基础知识 学习笔记(7)
查看>>
IDEA使用之让maven项目自动依赖jar包
查看>>
Java核心技术 卷I 基础知识 学习笔记(8)
查看>>
Java核心技术 卷I 基础知识 学习笔记(9)
查看>>
Intellij IDEA 创建资源文件夹 source folder
查看>>
Java核心技术卷2 高级特性 学习笔记(1)
查看>>
Java核心技术卷2 高级特性 学习笔记(4)
查看>>
最大乘积
查看>>
最长公共子串
查看>>
codeforces831c 思维
查看>>