クイックソートの初心者の理解
——————————————————————————————
シャオカイジは、今回学んだことを共有します。可能な限り詳細に説明します。結局のところ、私も新人です。
クイックソート
クイックソートは、その名前が示すように高速です。バブルソートやバケットソートと比較して、クイックソートは両方の利点を兼ね備えています。高速でメモリを節約します。説明させてください。
栗をあげましょう: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ループ、文字交換、配列、配列添え字の理解、およびプログラムフローの理解が含まれます。ご不明な点がございましたら、ご質問ください。また、私に提案をすることを歓迎します。ありがとうございました!