ソート:バブルソート、クイックソート、shellソート

2255 ワード

1、発泡ソート法
構想:整形配列a[n]は、配列aを小さいものから大きいものに並べ、泡ソート法を採用することを要求する.
すなわち、第1回目は、目的である最小値をa[0]に、テールa[n-1]からa[0]に走査し、a[k](0)に対して
2パス目は、目的である2番目の小さな値をa[1]に、テールa[n-1]からa[1]にスキャンすればよい.a[k](0)
       ……
n−1パス目、目的−n−1の小さい値をa[n−2]に置くと、前のn−2個の数が順序付けされているため、尾a[n−1]からa[n−2]にスキャンするだけでよい.
これで終わり、全体的な考えは、小さな値を前に移動し続けることです.バブルソート法には、配列長に基づいて一定の回数をスキャンしなければならないという欠点があり、順序が整いましたら、このように繰り返しスキャンを続け、終了するまで判断条件を追加することができ、スキャン中にデータ交換がなければ順序が整い、ここで終了すればよいという判断条件を追加することができます.
プログラム:
//bubbel sort
#include 
using namespace std;

void BubbleSort(int a[],const int length)
{
  bool exchange=false;
  for(int i=0;ii;j--)
	{
	  if(a[j]

2、快速ソート法
高速ソート法はバブルソート法によって改善され、QuickSort(char a[],int s,int t)の全体的な考え方は以下の通りである.
1、整形配列a[n]について、まずある位置の値を指定し、例えばa[s]を指定し、それを一時変数tempに与える.
2、配列a要素を表す2つの下付きi=s,j=t.命令temp=a[i].
3、jに対して、a[j] までj--を続ける
4、iについては、a[i]>tempまでi++を継続し、a[i]をa[j]、すなわちa[j]=a[i]に付与する.
5、このようにループ3、4は、i=jが終了するまでtempをa[i]に付与する.
上の1、2、3、4、5から分かるように、現在位置のtempは、その左側の値がtempよりも小さく、その右側の値がtempよりも大きく、配列を2つの部分に分けている.
6、再帰を運用して、tempの左側にQuickSort(a,s,i-1)を並べ替える.tempの右側にQuickSort(a,i+1,t)を並べ替える.
7、終了条件は関数パラメータs
//quick sort
#include 
using namespace std;

void QuickSort(int a[],  int s,  int t)
{

  if(si && a[j]>temp)
			  j--;
		  a[i]=a[j];

		  while(i

3、shell並べ替え
ヒルソート
1つの構想は、配列a[n]に対して、d=nとする.d=(d+1)/2;a[i]とa[i+d](0<=ia[i+d]を順に比較すると、iに対して0からd-1まで交換されないまで交換される.
再びd=(d+1)/2とし、a[i]とa[i+d](0<=ia[i+d)を順に比較すると、iが0からd-1まで交換されないまで交換する.
……
d>1が満たされないまで.
#include 
using namespace std;
void ShellSort(int *a,int n)
 {
     int d=n;
	 while(d>1)
	 {
	    d=(d+1)/2;
		bool exchange=false;
		do
		{
			for(int i=0;i