D&Cアイデア - クイックソートアルゴリズム

アルゴリズムは唯一の状況に対処することができ、使用することは、必然的に限られています。だから、今日は、私たちはツールを使用することができます問題、いずれかの解決策のアイデアを導入しました。

分割統治の分割統治

D&Cの動作原理を説明するのに最初:

(1)単純なベースライン条件を見つけます。

(2)それは、ベースライン条件を満たすように、問題の規模を縮小する方法を決定します。


例えば、初めて目に

10 20 30

たとえば、私たちはあなたの最初の考えが何であるかを、一緒にいくつかの数字の上にしたいですか?
私はそのサイクルを考え始めています、私はあなたが持っているべきだと思うと私は同じバーを持っていると思います。

さて、今日は私たちD&Cを解決するために考えて、別のアイデアを持っています。

  • 上記ベースラインの条件は何ですか?
  • 私たちの基本条件を満たすために、そのサイズを小さくするには?

私たちは、整数配列と、最も単純なケースを計算し、何がありますか?

1.配列が空である
配列が唯一の要素である2.

ほとんどの場合、我々は、配列を計算し、通常の状況下では、配列が空でないことをしなければなりません。したがって、私たちの理想的な状況では、配列の唯一の要素です。ベースラインの条件が確認されています。

次に、どのようにベースラインの状況にそれを打破するには?

 1.把第一个元素拆出来: 10 + sum(20+30)
 2.把第二个元素拆出来: 10 + sum(20 + sum(30))

層によるプログレッシブ層は、すべての要素の配列を見つけることができます。
さて、次のPythonのコードを見て:

def sum(L):
	
	#递归的退出条件
	if l == []:
		return 0
	return l[0] + sum(l[1:])

D&Cはの理解を考え、そして最後のクイックソートを見てみましょう

迅速なシーケンシングは、選択ソートよりも高速の共通ソートアルゴリズムです。

配列をソートするには、その後、ベースラインそれは何ですか?実際には、配列と同じように合計します。配列が空である、または配列の要素は1つだけ存在する場合、ソート、それは非常に簡単です、それ自身です。

三つの要素を含む第1選別配列
7 2 10

ときにアプリケーションクイックソート、あなたが第一の基準値(ピボット)としての要素を選択する必要があり、通常の状況下では、我々は、基準値として最初の要素を選択してください。

基準値として選択し、上記アレイ7。

次いで、バック横切る、ベースライン値の左側に要素の基準値以下を検出しました。ベースライン値の右側には、基準値よりも大きい要素に遭遇します。これは、パーティション(パーティション)と呼ばれています。

現在の状況を見てください:

  • 全てのデジタルワードからなるグループは、その基準値よりも小さいです。
  • 参考値;
  • その基準値よりも大きいすべての配列ワードのグループ。

さて、配列の3つの要素のみのためにソートされています。

その後、四つの要素を含む配列を見て

12 8 2 15

まず、最初のラウンドが完了した後に、ソートされた基準値12、として、それは次のようになります。

8 2 12 15

さて、配置は次のとおりです。

<参考値 参考値 >参考値

部分が基準値よりも大きい場合、一つだけの要素は、ソートする必要はありません。
基準値よりセクションは、同じの2つの要素は、私たちは、ソート、上記の方法で、再帰呼び出しに従ってください。最後に、我々が得ます:

2 8 12 15

要素の数千人のこと、五行のため、6つの要素、数千人、数十?同様に、ああ、再帰呼び出し、あなたが並べ替えることができます。

クイックソートのpythonコード:

def quick_sort(arr):
	if len(arr) < 2:
		return arr
	else:
		pivot = arr[0]
		less = [i for i in arr[1:] if i < pivot]
		greater = [j for j in arr[1:] if j > pivot]
		return quick_sort(less) + [pivot] + quick_sort(greater)

print(quick_sort([2,8,12,15,32,4,56,12]))

出力:

[2, 4, 8, 12, 15, 32, 56]

クイックソートの時間計算量はO(nlogn)

注意:再帰の終了条件が与えられなければなりません

最後に、クイックソートのC言語で見ます

#include<stdio.h>

#define N 5

int arr[N] = {23,65,156,545,32};

void quick_sort(int arr[],int low,int high)
{
    //base value
    int pivot = arr[low];
    int i = low;
    int j = high;
    if(i > j)
       return;
    
    while(i < j)
    {
        while((i < j) && (arr[j] >= pivot))
            j--;
        if(i < j)
            arr[i] = arr[j];
        while((i < j) && (arr[i] <= pivot))
            i++;
        if(i < j)
            arr[j] = arr[i];
    }

    arr[i] = pivot;
    quick_sort(arr,low,i-1);
    quick_sort(arr,j+1,high);

}

void main()
{
    int i;
    quick_sort(arr,0,4);
    for(i = 0;i < 5;i++)
    {
        printf("%d \n",arr[i]);
    }
}

Pythonコードに対してビット複雑なC言語コード。Cコードは、ピボットの点よりも大きい横断される要素を指すように二つのポインタ未満のピボット点を定義します。

おすすめ

転載: blog.csdn.net/weixin_37731316/article/details/89553011