高速並べ替えの原理とC実現
1881 ワード
概要
高速ソートは再帰原理を用いて実現される一般的なソートアルゴリズムであり,本稿では高速ソートを用いて配列をソートすることを紹介する.
配列が空であるか、または1つの要素だけがソートする必要がないため、高速ソート再帰のベースライン条件は配列長が2未満である.
きほんげんり
まず、配列から基準値(pivot)と呼ばれる要素を選択します.次に、ベース準値より小さい要素と、ベース準値より大きい要素を見つけます.このプロセスをパーティション(partioning)と呼びます.パーティションを行った後、得られた2つのサブ配列は無秩序です.
例えば対数グループ
5
2
4
1
3
最後の要素3を選択して基準値としてパーティション化
2
1
3
5
4
次のようになります.基準値より小さいすべてのサブ配列 基準値 は、基準値より大きいすべてのサブ配列からなる.
2つのサブ配列を再帰的に操作します.
C言語のクイックソート例
高速ソートは再帰原理を用いて実現される一般的なソートアルゴリズムであり,本稿では高速ソートを用いて配列をソートすることを紹介する.
配列が空であるか、または1つの要素だけがソートする必要がないため、高速ソート再帰のベースライン条件は配列長が2未満である.
きほんげんり
まず、配列から基準値(pivot)と呼ばれる要素を選択します.次に、ベース準値より小さい要素と、ベース準値より大きい要素を見つけます.このプロセスをパーティション(partioning)と呼びます.パーティションを行った後、得られた2つのサブ配列は無秩序です.
例えば対数グループ
5
2
4
1
3
最後の要素3を選択して基準値としてパーティション化
2
1
3
5
4
次のようになります.
2つのサブ配列を再帰的に操作します.
C言語のクイックソート例
#include
#include
#include
void myswap(void *a, void *b, size_t width)
{
char tmp;
int i;
for (i = 0; i < width; i++){
tmp = *((char*)a + i);
*((char*)a + i) = *((char*)b + i);
*((char*)b + i) = tmp;
}
}
int partitioning(int *arr, int l, int r)
{
//
int pivot = arr[r];
//
int last_less_idx = l - 1;
for (int i = l; i < r; i++){
if (arr[i] < pivot){
last_less_idx++;
myswap(&arr[i], &arr[last_less_idx], sizeof(int));
}
}
//
myswap(&arr[last_less_idx + 1], &arr[r], sizeof(int));
//
return last_less_idx + 1;
}
void myqsort(int *arr, int l, int r)
{
int partition_idx;
if (l >= r)
return;
partition_idx = partitioning(arr, l, r);
myqsort(arr, l, partition_idx - 1);
myqsort(arr, partition_idx + 1, r);
}
void show_arr(int *arr, int l, int r)
{
for (int i = l; i <= r; i++){
printf("%d ", arr[i]);
}
}
int main(int argc, char* argv[])
{
int arr[10];
int i;
srand(time(NULL));
for (i = 0; i < 10; i++){
arr[i] = rand() % 100;
}
printf("show array before qsort
");
show_arr(arr, 0, 9);
myqsort(arr, 0, 9);
printf("
show array after qsort
");
show_arr(arr, 0, 9);
return 0;
}