クイックソートの初心者の理解

クイックソートの初心者の理解

——————————————————————————————
シャオカイジは、今回学んだことを共有します。可能な限り詳細に説明します。結局のところ、私も新人です。

クイックソート
クイックソートは、その名前が示すように高速です。バブルソートやバケットソートと比較して、クイックソートは両方の利点を兼ね備えています。高速でメモリを節約します。説明させてください。
栗をあげましょう:6 1 2 7 9 3 4 5 10 8
最初に、最初の番号6を参照番号として使用し(実際には参照番号です)、次に次の番号を分類します。 6より小さくなります。数字は6の右側に配置され、6より大きい数字は左側に配置されます。次のように。3 1 2 5 4 6 9 7 10 8(右から左にソートされ、3と6の位置が入れ替わります)このとき、最終的なベンチマーク番号が次のようになるまで、それぞれ左側と右側で同じ手順を実行します。両側で交換する必要はありません(機能はここで必要です)。しかし、これは私たちの考えです。
我々は、(偶数が問題ではありません)今回我々は途中で開くことができないが、第6は、その後数6及び中間交換位置の最初の番号を交換する、アレイを使用する数字のセットに直面し、
特定最初の注文プロセスは次のとおりです。6127
9 3 4 5 10 8
6 1 2 5 9 3 4 7 10 8
6 1 2 5 4 3 9 7 10 8
3 1 2 5 4 6 9 7 108繰り返します6の両側の上記の操作。あなたはそれについて自分で考えなければなりません。コードを提供します。

#include <stdio.h>
int a[100];//定义全局变量  有因为两个子函数都要用
void quicksort(int left,int right)
{
    
    
	int i,t,j,first;
	first=a[left];
	i=left;
	j=right;
	while(i!=j)//两边的下标不相同是可以进行循环,相当于从搜索到了中间
	{
    
    
		while(a[j]>=a[left] && i<j)//先从右向左寻找 
			j--;
		while(a[i]<=a[left] && i<j)//从左向右寻找
			i++;
		if(i<j)//进行交换
		{
    
    
			t=a[j];
			a[j]=a[i];
			a[i]=t;
		}

	}
	a[left]=a[i];
	a[i]=first;//基准数的位置交换
	quicksort(left,i-1);//左边交换一轮后 左边要长度要‘-1’因为基准数站了一个位子
	quicksort(i+1,right);//右边进行操作
}
int main()
{
    
    
	int i,n;
	printf("请输入数组的长度\n");
	scanf("%d",&n);
	printf("请输入要排序的数字\n");
	for(i=1;i<=n;i++)
	{
    
    
		scanf("%d",&a[i]);
		
	}
	quicksort(1,n);
	for(i=1;i<=n;++i)
	{
    
    
		printf("%d",a[i]);
	}
	getchar();getchar();//这里相当于system("pause");
	return 0;
}

ここで使用される知識には、関数、forループ、文字交換、配列、配列添え字の理解、およびプログラムフローの理解が含まれます。ご不明な点がございましたら、ご質問ください。また、私に提案をすることを歓迎します。ありがとうございました!

おすすめ

転載: blog.csdn.net/m0_52699073/article/details/110357323