いくつかのC言語で実施される順序付けアルゴリズム
並べ替えはデータ構造の中で常に試験する内容で、本文はいくつかの常用する並べ替えに対して整理を行って、それによって調べます.
最初に並べ替えを行う配列を定義します.
最初に並べ替えを行う配列を定義します.
#define MAXSIZE 10
#include<stdio.h>
typedef struct
{
int a[MAXSIZE];
int length;
}List;
印刷配列関数
void Print(List *L)
{
int i;
for(i=0; i<L->length; i++)
printf("%d ", L->a[i]);
printf("
");
}
交換関数
void swap(List *L, int i, int j)
{
int tmp = L->a[i];
L->a[i] = L->a[j];
L->a[j] = tmp;
}
並べ替えを選択
/*********** ***********
void SelectSort(List *L)
{
int i, j;
int min;
for(i=0; i<L->length; i++)
{
min = i;
for(j=i; j<L->length; j++)
{
if(L->a[min]>L->a[j])
{
min = j;
}
}
if(i != min)
swap(L, i, min);
}
}
並べ替えを選択/*********** ***********/
void InsertSort(List *L)
{
int i, j;
for(i=1; i<L->length; i++)
{
if(L->a[i] < L->a[i-1])
{
int key = L->a[i];
for(j=i-1; L->a[j]>key && j>=0; j--)
L->a[j+1] = L->a[j];
L->a[j+1] = key;
}
}
}
/*********** ***********/
void ShellSort(List *L)
{
int i, j;
int increment = L->length;
do
{
increment = increment/3;
for(i=increment; i<L->length; i++)
{
if(L->a[i]<L->a[i-increment])
{
int tmp = L->a[i];
for(j=i-increment; j>=0&&tmp<L->a[j]; j-=increment)
L->a[j+increment]=L->a[j];
L->a[j+increment] = tmp;
}
}
}while(increment);
}
クイックソート/*********** ***********/
int Partation(List *L, int low, int high)
{
int key = L->a[low];
while(low<high)
{
while(low<high && key<=L->a[high])
high --;
swap(L, low, high);
while(low<high && key>=L->a[low])
low ++;
swap(L, low, high);
}
return low;
}
void QuickSort(List *L, int low, int high)
{
int mid;
if(low<high)
{
mid = Partation(L, low, high);
QuickSort(L, low, mid-1);
QuickSort(L, mid+1, high);
}
}
/************ ***********/
メイン関数/************* ***********/
int main()
{
List L = {{9, 5, 3, 1, 2, 6, 7, 4, 8}, 9};
InsertSort(&L);
// ShellSort(&L);
// QuickSort(&L);
// SelecttSort(&L);
// Print(&L);
}