堆排序c语言

来源:互联网 发布:win7开机windows后黑屏 编辑:程序博客网 时间:2024/04/30 17:37

利用最小堆排序// teat.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<iostream>#include<fstream>#include<time.h>using namespace::std;#define N 50000+1void PushDown(int first, int n);void Swap(int &a, int &b);int A[N];int main(){int opr;ifstream in;ofstream out;/*in.open("C:\\Users\\asus\\Documents\\Visual Studio 2017\\Projects\\teat\\666.txt");if (in.fail())cout << "ERROR!" << endl;else{for (int opt = 1; opt <N; opt++){in >> A[opt];}}*/srand((unsigned)time(NULL));//设置随机数种子for (int i = 1; i < N; i++){A[i]= (rand() % (N - 1) + 1);//生成随机数}out.open("C:\\Users\\asus\\Documents\\Visual Studio 2017\\Projects\\teat\\output.txt");if (out.fail())cout << "ERROR!" << endl;clock_t start = clock();//建最小堆for (opr = (N-1) / 2; opr >= 1; opr--){PushDown(opr, N-1);}//排序输出for (int t = N-1; t >= 2; t--){Swap(A[1], A[t]);PushDown(1, t - 1);}clock_t end = clock();for (int p = N - 1; p >= 1; p--){out << A[p] << "   ";}cout << "time is"<<(double)(end - start);//计算运行时间    return 0;}void PushDown(int first, int n){int temp=first;while (temp <= n / 2){if ((temp == n / 2) && (n % 2 == 0)){if (A[temp] > A[2 * temp]){Swap(A[temp], A[2 * temp]);}temp = n;//exit cycle!!!}else if ((A[temp] > A[2 * temp]) && (A[2 * temp] <= A[temp * 2 + 1])){Swap(A[temp], A[2 * temp]);temp = 2 * temp;}else if ((A[temp] > A[2 * temp + 1] )&&( A[2 * temp + 1] < A[2 * temp])){Swap(A[temp], A[temp * 2 + 1]);temp = temp * 2 + 1;}elsetemp = n;}}void Swap(int &a, int &b){int temp;temp = a;a = b;b = temp;}

原创粉丝点击