归并排序相信大家都不陌生,如果实在不知道就看看这个:
点击打开链接,这里就不解释了。
它的时间复杂度为O(n*lgn),相对来说比较快.
闲话不多说。下面是c++实现:
#include<iostream>
#include<stdlib.h>
using namespace std;
//复杂度为nlgn的算法
//归并算法从小到大排序
#define long_num 30 //long_num是需要比较的数组的长度
int s[long_num];
void sort(int i[],const int length) {
if (length==1) {
return;
}
int mid = int(length / 2); //mid为第一个数组的长度大小
sort(i,mid);
sort(&i[mid], length - mid);
//这个for循环的用处是将i[]排序且赋值给s[];
for (int main=0,left=0,right=0;;) {
if (right >= length-mid) {
while (left< mid)
{
s[main] = i[left];
main++;
left++;
}
break;
}else if (left>=mid) {
while (right<length-mid)
{
s[main] = i[mid + right];
main++;
right++;
}
break;
}else if (i[left] <= i[right+mid]) {
s[main]=i[left];
left++;
main++;
}
else if(i[left] > i[right+mid]) {
s[main] = i[mid + right];
right++;
main++;
}
else {
cout << "some thing wrong!!!";
}
}
//将s[]一个个数值赋值给i[]
for (int num = 0; num < length; num++) {
i[num] = s[num];
}
}
int outprint(int k[]) {
for (int i = 0; i < long_num;i++) {
cout << k[i] << endl;
}
return 0;
}
//随机产生long_num个数写到k数组里,这里我们随机生成数组
void random(int k[]) {
for (int i = 0; i < long_num;i++) {
k[i] = rand();
}
}
void main() {
int k[long_num] ;
random(k);
sort(k,long_num);
outprint(k);
system("pause");
}
参考视频,麻省理工学院公开课--算法导论第一章。