データ構造――各種並べ替えアルゴリズムの比較
一.実験の目的
一般的な並べ替えアルゴリズムを実現して,これらのアルゴリズムの理解を深め,今後これらのアルゴリズムを実際の問題の解決に応用できる.
実験のテーマ
並べ替えは、実際の問題でよく使われるアルゴリズムであり、快速、選択、挿入の3つの並べ替えアルゴリズムは、並べ替えアルゴリズムの中で最も簡単であり、最もよく使われているものであり、この3つのアルゴリズムを実現し、異なる数値系列で実行し、その後、3つの方法の空間的複雑さと時間的複雑さを比較し、比較結果を分析して、この3つの並べ替えアルゴリズムを選択する一般原則を導き出す.
三.実現ヒント
1.列待ちシーケンスのデータ構造説明:
四.思考と選択
1.他の並べ替えアルゴリズムの比較をさらに検討し、類似の時間複雑度と空間複雑度の分析を得て、特に異なるアルゴリズムに対して、テストデータの構造もできるだけ豊富にするように注意してください.
五.私の実現
(1) ソートアルゴリズムの実装
一般的な並べ替えアルゴリズムを実現して,これらのアルゴリズムの理解を深め,今後これらのアルゴリズムを実際の問題の解決に応用できる.
実験のテーマ
並べ替えは、実際の問題でよく使われるアルゴリズムであり、快速、選択、挿入の3つの並べ替えアルゴリズムは、並べ替えアルゴリズムの中で最も簡単であり、最もよく使われているものであり、この3つのアルゴリズムを実現し、異なる数値系列で実行し、その後、3つの方法の空間的複雑さと時間的複雑さを比較し、比較結果を分析して、この3つの並べ替えアルゴリズムを選択する一般原則を導き出す.
三.実現ヒント
1.列待ちシーケンスのデータ構造説明:
#define MAXSIZE 20 //
typedef int KeyType; //
typedef struct
{
KeyType key; //
InfoType otherifo; //
}RedType; //
typedef struct
{
RedType r[MAXSIZE+1]; //r[0]
int length; //
}SqList; //
2.順序待ちシーケンスは、基本的な順序及び基本的な無秩序の場合など、様々なデータの場合にアルゴリズムの優劣性の比較を得ることができる.四.思考と選択
1.他の並べ替えアルゴリズムの比較をさらに検討し、類似の時間複雑度と空間複雑度の分析を得て、特に異なるアルゴリズムに対して、テストデータの構造もできるだけ豊富にするように注意してください.
五.私の実現
(1) ソートアルゴリズムの実装
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20 //
/************************************* *************************************/
typedef int KeyType; //
typedef char InfoType;
typedef struct
{
KeyType key; //
InfoType otherifo; //
}RedType; //
typedef struct
{
RedType r[MAXSIZE+1]; //r[0]
int length; //
}SqList; //
/**************************************** *****************************************/
/*
.
: , ,
, ,
。
: O(nlogn), 。
; ,
O(n2) 。 , 。
, O(nlogn)。 。
*/
void QuickSort(SqList &L,int l,int h)
{
if (l>=h)
return ;
int j ,i,key;
i=l;
j=h;
key=L.r[i].key;
while(i<j)
{
while(i<j&&L.r[j].key>key)
j--;
if (i<j)
L.r[i++].key=L.r[j].key;
while (i<j&&L.r[i].key<key)
i++;
if (i<j)
L.r[j--].key=L.r[i].key;
}
L.r[i].key=key;
if (l<i-1)
QuickSort(L,l,i-1);
if (i+1<h)
QuickSort(L,i+1,h);
}
/*
。
: ( ) ,
, 。 。
*/
void SelectSort(SqList &L)
{
int i,j,m,n=L.length+1 ;
int t ; //
for(i=1;i<n;i++)
{
m=i ;
for(j=i+1;j<n;j++)
{
if(L.r[j].key<L.r[m].key)
m=j;
}
if(m!=i)
{
t=L.r[i].key;
L.r[i].key=L.r[m].key;
L.r[m].key=t ;
}
}
}
/*
。
: , 、 。
O(n); O(n2) 、 ,
, 、 。
*/
void InsertSort(SqList &L)
{
// L 。
int i,j;
for (i=2; i<=L.length; ++i)
if (L.r[i].key<L.r[i-1].key)
{
// "<" , L.r[i]
L.r[0] = L.r[i]; //
for (j=i-1; L.r[0].key<L.r[j].key; --j)
L.r[j+1] = L.r[j]; //
L.r[j+1] = L.r[0]; //
}
}
/*
. .
*/
void myPrint(SqList &L)
{
for(int i = 1;i<MAXSIZE+1;i++)
{
printf("%d ",L.r[i].key);
}
printf("
");
}
/***************************************main *************************************/
int main()
{
//1. 20
SqList s,s1,s2,s3;
s.length=20;
for(int i = 1;i<MAXSIZE+1;i++)
{
scanf("%d",&(s.r[i].key));
}
s1=s2=s3=s;
//2.
printf(" ---> :
");
myPrint(s);
QuickSort(s3,1,s3.length); //
printf(" :
");
myPrint(s3);
printf(" ---> :
");
myPrint(s);
SelectSort(s1); //
printf(" :
");
myPrint(s1);
printf(" ---> :
");
myPrint(s);
InsertSort(s2); //
printf(" :
");
myPrint(s2);
system("PAUSE");
return 0;
}
(2) アルゴリズムの性能比較#include<stdio.h>
#include<stdlib.h>
#include <time.h> //
#define MAXSIZE 10000 //
/************************************* *************************************/
typedef int KeyType; //
typedef char InfoType;
typedef struct
{
KeyType key; //
InfoType otherifo; //
}RedType; //
typedef struct
{
RedType r[MAXSIZE+1]; //r[0]
int length; //
}SqList; //
/**************************************** *****************************************/
/*
.
: , ,
, ,
。
: O(nlogn), 。
; ,
O(n2) 。 , 。
, O(nlogn)。 。
*/
void QuickSort(SqList &L,int l,int h)
{
if (l>=h)
return ;
int j ,i,key;
i=l;
j=h;
key=L.r[i].key;
while(i<j)
{
while(i<j&&L.r[j].key>key)
j--;
if (i<j)
L.r[i++].key=L.r[j].key;
while (i<j&&L.r[i].key<key)
i++;
if (i<j)
L.r[j--].key=L.r[i].key;
}
L.r[i].key=key;
if (l<i-1)
QuickSort(L,l,i-1);
if (i+1<h)
QuickSort(L,i+1,h);
}
/*
。
: ( ) ,
, 。 。
*/
void SelectSort(SqList &L)
{
int i,j,m,n=L.length+1 ;
int t ; //
for(i=1;i<n;i++)
{
m=i ;
for(j=i+1;j<n;j++)
{
if(L.r[j].key<L.r[m].key)
m=j;
}
if(m!=i)
{
t=L.r[i].key;
L.r[i].key=L.r[m].key;
L.r[m].key=t ;
}
}
}
/*
。
: , 、 。
O(n); O(n2) 、 ,
, 、 。
*/
void InsertSort(SqList &L)
{
// L 。
int i,j;
for (i=2; i<=L.length; ++i)
if (L.r[i].key<L.r[i-1].key)
{
// "<" , L.r[i]
L.r[0] = L.r[i]; //
for (j=i-1; L.r[0].key<L.r[j].key; --j)
L.r[j+1] = L.r[j]; //
L.r[j+1] = L.r[0]; //
}
}
/*
10000 。
1 。 。 。
*/
SqList random()
{
SqList s;
s.length=10000;
int i,j;
srand((int)time(0));
for(i=0;i<10000;i++)
{
j=1+(int)(1000.0*rand()/(RAND_MAX+1.0));
s.r[i].key=j;
}
return s;
}
/*************************************** main *************************************/
int main()
{
SqList s1;
s1.length=10000;
clock_t start,end;
//
s1 = random();
start = clock();
QuickSort(s1,1,s1.length);
end = clock();
printf( " 1 %lf
", (double)(end-start)/CLOCKS_PER_SEC);
//
s1 = random();
start = clock();
SelectSort(s1);
end = clock();
printf(" 1 %lf
", (double)(end-start)/CLOCKS_PER_SEC);
//
s1 = random();
start = clock();
InsertSort(s1);
end = clock();
printf(" 1 %lf
", (double)(end-start)/CLOCKS_PER_SEC);
system("PAUSE");
return 0;
}
転載は出典を明記してください.