1. 目的:
アルゴリズムの概念と問題解決プロセスを習得します。
2. 実験内容
n 個の整数の並べ替え問題をさまざまな方法で解きます。
3. 設計とコーディング
1. アルゴリズム擬似コード
1.1 バブルソート
入力:順序なし配列 a[]、配列要素数 n
出力:順序付き配列 a[n]
1. 交換の初期値を n-1 と定義する
2. と判断した場合交換値が 0 ではない
2.1 交換値にバインドされる最大値を設定する
2.2 r[j]>r[j+1] の場合
2.3 交換値を r[j] と交換する
1.2 選択ソート
入力: 順序なし配列 a[]、配列要素数 n
出力: 順序付き配列 a[n]
1. インデックスの初期値を r[i]、j=i+1 と定義
2. r[j ] を判定<r[index]
2.1 r[j]とr[index]の値を交換する
1.3 クイックソート
入力: 順序なし配列 a[]、配列の最初のアドレス番号 first、最後のアドレス番号 end
出力: 順序付き配列 a[n]
1. 最初のアドレス番号 first が最後のアドレス番号 end より小さいかどうかを判断します
。 1.1 If first< end && a[first]<=a[end], end–
1.1.1 a[first] と a[end] の値を交換する、first++
1.2 If first<end && a[first]<=a [end]、end++
1.2.1 a[first] と a[end] の値を交換します、first–
2. プログラムコード
2.1 バブルソート
#include<stdio.h>
void BubbleStort(int r[],int n)
{
int bound,exchange=n-1;
while(exchange!=0)
{
bound=exchange;
exchange=0;
for(int j=0;j<bound;j++)
if(r[j]>r[j+1])
{
int temp=r[j];
r[j]=r[j+1];
r[j+1]=temp;
exchange=j;
}
}
}
2.2 選択の並べ替え
void SelectSort(int r[],int n)
{
int i,j,index,temp;
for(i=0;i<n-1;i++)
{
index=i;
for(j=i+1;
j<n;j++)
if(r[j]<r[index]) index=j;
if(index!=i)
{
temp=r[i];
r[i]=r[index];
r[index]=temp;
}
}
}
2.3 クイックソート
int Partition(int r[],int first,int end)
{
int i=first,j=end;
while(i<j)
{
while(i<j&&r[i]<=r[j]) j--;
if(i<j)
{
int temp=r[i];r[i]=r[j];r[j]=temp;
i++;
}
while (i<j&&r[i]<=r[j]) i++;
if(i<j)
{
int temp=r[i];r[i]=r[j];r[j]=temp;
j--;
}
}
return i;
}
PS: 再帰的な実装
int Partition(int r[],int first,int end){
int i=first,j=end;
while(i<j){
while(i<j&&r[i]<=r[j]) j--;
if(i<j)
{
int temp=r[i];r[i]=r[j];r[j]=temp;
i++;
}
while (i<j&&r[i]<=r[j]) i++;
if(i<j){
int temp=r[i];r[i]=r[j];r[j]=temp;
j--;
}
}
return i;
}
void QuickSort(int r[],int first,int end){
int pivot;
if(first<end){
pivot=Partition(r,first,end);
QuickSort(r,first,pivot-1);
QuickSort(r,pivot+1,end);
}
}
int main(){
int a[5]={
7,5,9,8,2};
printf("初始数组:7,5,9,8,2\n");
QuickSort(a,7,2);
putnum(a,5);
}
2.4 出力(メイン関数)
void putnum(int r[],int n)
{
int i;
printf("输出序列:");
for(i=0;i<n;i++)
printf("%d ",r[i]);
}
int main()
{
int a[6]={
30,8,7,45,5,24};
printf("输入序列:30 8 7 45 5 24\n");
BubbleStort(a,6); //冒泡排序
putnum(a,6);
// SelectSort(a,6); //选择排序
// Partition(a,6,1); //快速排序
// QuickSort(a,7,2);
}
4. 運用結果と分析
1. 結果のスクリーンショット
2. 分析
バブル ソート、選択ソート、クイック ソートを使用して、指定された配列を正常にソートしました。各分類方法には独自の利点があり、効率を最大化するには、状況に応じて異なる分類方法を使用する必要があります。バブルソート法は選択法に比べて比較的単純ですが、バブル法は要素の順序を毎回入れ替える必要があるのに対し、選択法は要素の添え字を記録するだけでよいため、効率は劣ります。データが小さい配列の場合はバブル法で十分ですが、データが大きい配列の場合は選択ソートの効率が大幅に向上します。クイック ソート方法は、名前が示すとおり、現在最も高速なソート方法ですが、バブル ソート方法ほど安定していません。
3. 時間計算量の計算結果
5. 実験の概要
実験中、ソートの知識はデータ構造上で学習しているため、ほとんどの場合は問題ありませんが、パラメータの設定や呼び出しなど一部の機能の知識を忘れてしまっていることが主な問題ですが、書籍や書籍などで学習しています。インターネット ツールは学習した知識をすぐに思い出すことができます。