运行结果:
![](https://img-blog.csdnimg.cn/img_convert/cb66c2889cb9e00f0329997d323a92dd.png)
![](https://img-blog.csdnimg.cn/img_convert/3742580d3655d9d61553b1c6d868e9b7.png)
![](https://img-blog.csdnimg.cn/img_convert/d051ae3a335f906934305a7cfdd7c8f1.png)
源代码:
#include<iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <cstdlib>
using namespace std;
using namespace cv;
const int width = 800;
const int height = 600;
cv::Mat img = Mat::zeros(height, width, CV_8UC3);
int* generate_random_data(int n)
{
srand(time(nullptr));
int* data = new int[n];
for (int i = 0; i < n; ++i)
data[i] = rand() % 600;
return data;
}
void draw_data(int data[], int n, int l, int r)
{
img.setTo(Scalar(255, 255, 255));
int k = 0;
for (int i = 0; i < 100; ++i)
{
//std::cout << data[i] << " ";
if (i >= l && i <= r) {
rectangle(img, Point(k, data[i]), Point(k + 7, 600), Scalar(0, 0, 255));
}
else {
rectangle(img, Point(k, data[i]), Point(k + 7.5, 600), Scalar(255, 0, 0));
}
k += 8;
}
//std::cout << endl;
imshow("Sort Visualization", img);
waitKey(60);
}
int b[200];
void merge(int a[], int left, int mid, int right) {
int i = left, j = mid + 1;
int k = left;
while (i <= mid && j <= right) {
if (a[i] <= a[j])b[k++] = a[j++];
else b[k++] = a[i++];
}
if (i > mid)for (int q = k; q <= right; q++)b[k++] = a[j++];
else for (int q = i; q <= mid; q++)b[k++] = a[i++];
for (int i = left; i <= right; i++)a[i] = b[i];
}
void sort(int a[], int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
sort(a, left, mid);
sort(a, mid + 1, right);
merge(a, left, mid, right);
draw_data(a, 100, left, right);
}
}
int main()
{
int n = 100;
int* data = generate_random_data(n);
sort(data,0,n-1);
waitKey(100000); // 暂停
delete[] data;
data = nullptr;
return 0;
}