#include <QCoreApplication>
int Rand[1000];
int Rank[1000];
int Tn = 0;
void Merge(int low, int mid, int high)
{
//主要用于比较[low, mid]-[mid+1, high]两个数组的内容的大小并进行排列
int i = low, j = mid+1, k = low;
while (i<=mid && j<=high) {
Tn +=3;
if(Rand[i]<Rand[j]){
Rank[k] = Rand[i];
i++;
Tn +=2;
}
else {
Rank[k] = Rand[j];
j++;
Tn +=1;
}
k++;
}
if(i>mid){
for(j;j<=high;j++){
Rank[k] = Rand[j];
k++;
Tn +=3;
}
}
else {
for(i;i<=mid;i++){
Rank[k] = Rand[i];
k++;
Tn +=3;
}
}
for(i = low;i <= high; i++){
Rand[i] = Rank[i];
Tn +=2;
}
}
void MergeSort(int low, int high)
{
int mid;
//归并排序的思想:递归把数组拆分成N/2项,Merge函数排序两块的大小
if (low < high)
{
Tn +=2;
mid = (low + high)/2;
MergeSort(low, mid);
MergeSort(mid+1, high);
Merge(low, mid, high);
}
}
int partition(int low, int high)
{
int i = low, j = high, temp;
while(1){
while(Rand[low] >= Rand[i]){
i++;
Tn +=2;
}
while(Rand[low] < Rand[j]){
j--;
Tn +=2;
}
if(i<j){
temp = Rand[i];
Rand[i] = Rand[j];
Rand[j] = temp;
Tn +=1;
}
else {
temp = Rand[low];
Rand[low] = Rand[j];
Rand[j] = temp;
break;
}
}
return j;
}
void QuickSort(int low, int high)
{
//用数组的第一个元素把数据分为比该数大的和比该数小的两个部分
int mid;
if(low < high){
Tn +=1;
mid = partition(low, high);
QuickSort(low, mid-1);
QuickSort(mid+1, high);
}
}
void InSort(int num)
{
int temp;
//插入排序:比较每次循环的第一个参数与它之前的参数的大小,插入到合适的位置
for(int i = 1; i < num; i++){
for(int j = i; j >= 0; j--){
if(Rand[j] < Rand[j-1]){
temp = Rand[j-1];
Rand[j-1] = Rand[j];
Rand[j] = temp;
}
else {
break;
}
}
}
}
void ModInSort(int num)
{
int temp, left = 0, right, mid;
//改进版插入排序:插入元素A[i]时使用二分查找代替原来的逐个比对
for(int i = 1; i < num; i++){
right = i;
left = 0;
while (left <= right) {
mid = (left + right)/2;
if(Rand[mid] >= Rand[i])
{
right = mid - 1;
}
else{
left = mid + 1;
}
}
temp = Rand[i];
for(int j = i; j > left; j--)
Rand[j] = Rand[j-1];
Rand[left] = temp;
}
}
void main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//随机生成数组
for(int i =0; i < 1000; i++)
{
Rand[i] = rand()%1000;
}
ModInSort(10);
// InSort(10);
// QuickSort(0, 1000);
// MergeSort(0, 1000);
printf("T(n) = %d\n", Tn);
//输出复杂度
//n = 100 时,快速排序复杂度:1709, 归并排序复杂度:304
//n = 1000 时,快速排序复杂度:28413, 归并排序复杂度:3004
//输出排序结果
for(int i =0; i < 1000; i++)
{
printf("%d\t", Rand[i]);
}
}
03-31
1184
11-01
1110
03-01
1884