クイックソートコードを書くためのC言語

1. クイックソート

クイックソートは、平均 O(n log n) 時間で実行できる比較ベースの並べ替えアルゴリズムであり、最も一般的に使用される高速で汎用的な並べ替えアルゴリズムの 1 つです。このアルゴリズムの基本的な考え方は、要素を「ピボット」 (通常は配列内の最初または最後の要素) として選択し、配列内の他のすべての要素をピボットと比較し、要素を以下にすることです。ピボットに部分配列を入れ、ピボットより大きい要素を別の部分配列に入れ、部分配列の要素が 0 または 1 つだけになるまでこの処理を各部分配列に再帰的に適用し、最後に部分配列を順番に連結すると、ソートされた配列が得られます。

具体的な手順は次のとおりです。

  • ピボット要素 (通常は最初または最後の要素) を選択します。
  • 配列を 2 つのサブ配列に分割し、ピボット要素に従って、ピボット要素以下の要素を左側のサブ配列に配置し、ピボット要素より大きい要素を右側のサブ配列に配置します。
  • 左右の部分配列に対してクイックソート操作を再帰的に実行します。
  • 最後に、左側、ピボット、右側の部分を接続して並べ替え結果を取得します。
    このアルゴリズムのパフォーマンスは、選択したピボット要素に依存します。理想的には、配列の中央にある要素を毎回ピボットとして選択できます。このとき、クイック ソート アルゴリズムの時間計算量は o(n log n) です。 。ただし、選択したピボットが両端から遠く離れている場合、アルゴリズムの効率が低下する可能性があり、時間計算量は o(n^2) に達します。したがって、実際のアプリケーションでは、通常、アルゴリズムのパフォーマンスを向上させるためにいくつかの最適化戦略が採用されます。

以下は、C 言語で実装されたクイック ソート アルゴリズムです。

2. コードの実装

#include <stdio.h>  
  
// 交换两个元素的值  
void swap(int *a, int *b) {
    
      
    int temp = *a;  
    *a = *b;  
    *b = temp;  
}  
  
// 分割函数,将数组分成左右两部分,并返回左右指针  
int partition(int arr[], int low, int high) {
    
      
    int pivot = arr[high]; // 选取最后一个元素作为基准值  
    int i = (low - 1); // i指向左边界  
  
    for (int j = low; j < high; j++) {
    
      
        if (arr[j] <= pivot) {
    
      
            i++;  
            int temp = arr[i];  
            arr[i] = arr[j];  
            arr[j] = temp;  
        }  
    }  
  
    int temp = arr[i + 1];  
    arr[i + 1] = arr[high];  
    arr[high] = temp;  
  
    return (i + 1); // 返回基准值的位置  
}  
  
// 快速排序函数  
void quickSort(int arr[], int low, int high) {
    
      
    if (low < high) {
    
      
        int pivot = partition(arr, low, high); // 选取基准值  
        quickSort(arr, low, pivot - 1); // 对左边部分递归排序  
        quickSort(arr, pivot + 1, high); // 对右边部分递归排序  
    }  
}  
  
int main() {
    
      
    int arr[] = {
    
    5, 2, 8, 3, 9, 1, 6};  
    int n = sizeof(arr) / sizeof(arr[0]);  
  
    quickSort(arr, 0, n - 1);  
  
    printf("排序后的数组:\n");  
    for (int i = 0; i < n; i++) {
    
      
        printf("%d ", arr[i]);  
    }  
    printf("\n");  
  
    return 0;  
}

上記のコードでは、swap関数を使用して2つの要素の値を交換し、partition関数を使用して配列を左右の部分に分割し、左右のポインタを返します。そして、quickSort関数がメインです。クイックソートの関数。配列を再帰的にソートするために使用されます。main 関数では、整数配列を定義し、quickSort 関数を呼び出してそれを並べ替えます。最後に、ソートされた配列を出力します。

方法 2:

#include <stdio.h>

void quicksort(int *arr, int left, int right) {
    
    
  
  if (left < right) {
    
    

    int pivot = arr[right];
    int i = left - 1;
    int temp;

    for (int j = left; j < right; j++) {
    
    
      if (arr[j] <= pivot) {
    
    
        i++;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
      }
    }
    
    i++;
    temp = arr[i];
    arr[i] = pivot;
    arr[right] = temp;

    quicksort(arr, left, i-1);
    quicksort(arr, i+1, right);

  }
}

int main() {
    
    
  
  int arr[] = {
    
    4, 2, 1, 6, 3, 5};
  int n = sizeof(arr)/sizeof(int);

  quicksort(arr, 0, n-1);

  printf("Sorted array: ");
  for (int i = 0; i < n; i++) {
    
    
    printf("%d ", arr[i]);
  }

  return 0;
}

クイック ソートの本体は、quicksort 関数です。この関数は、整数配列 arr、配列の左境界、配列の右境界の 3 つのパラメーターを受け入れます。次に、分割と並べ替えのために関数内で再帰が使用されます。

クイックソート機能では、まず左右のポインタが等しいかどうかを判定し、等しくない場合はソート処理に入ります。

ピボットとして選択された要素は arr[right] です。i および j ポインターの移動中、小さい要素は [left, i-1] の間隔に配置され、i は交換される次の位置を指します。最後にピボット要素を所定の位置に配置します。

最後に、タスクが処理されるまで、左と右の間隔を再帰的に並べ替えます。

クイックソート関数が実行されると、ソートされた結果が出力されます。

おすすめ

転載: blog.csdn.net/fumeidonga/article/details/130332067