ソートアルゴリズム学習ノート-C言語バージョン


//泡立ち順
//概要:バブルソートは、ソートされた記録配列R[1..n]を垂直に並べ、各記録R[i]は、重量kiの気泡と見なされる.
//軽気泡は重気泡の下ではいけないという原則に基づき、配列Rを下から上へ走査する.本原則に違反する軽い気泡をスキャンすると、それを上に「浮遊」させる.
//最後の2つの気泡がいずれも軽いものが上、重いものが下になるまで繰り返します.
#include
#define n 10
int main()
{
              int i, j,temp;
              int array[10] = { 1, 2, 0, 5, 9,3, 4, 6, 7, 8 };
              for (i = 0; i < n- 1;i++)        //       
              for (j = 0; j < n- 1 - i;j++)   //             i             
              {
                            if (array[j+1] 

 
//直接選択ソート
//profile:ソートを直接選択するプロセスは、まずすべてのレコードの中でシーケンスコードの最小のレコードを選択し、それを1番目のレコードと交換します.
//そして残りのレコードの中からソートコードの最小のレコードを選び、2番目のレコードと交換する…すべてのレコードが並ぶまで順番に類推します.
#include
#define n 10
int main()
{
              int i, j, k,temp;
              int a[n] = { 9, 5, 1, 6, 2, 3, 8,4, 7, 0 };
              for (i = 0; i < n - 1; i++)
              {
                            k = i;
                            for (j = i + 1; j< n; j++)
                            {
                                          if(a[k]>a[j])
                                                        k= j;
                            }
                            if (k != i)
                            {
                                          temp =a[i];
                                          a[i] =a[k];
                                          a[k] =temp;
                            }
              }
              for (i = 0; i <= 9; i++)
              {
                            printf("%3d",a[i]);
              }
              return 0;
}

 
//並べ替えを直接挿入
//概要挿入ソートのプロセスは、i番目のレコードを挿入する場合、R 1,R 2,..Ri-1はすでに順番に並んでいて、
//i番目のレコードのソートコードKiをR 1,R 2,.,Ri−1のソートコードを1つずつ比較し,適切な位置を見つけた.
//直接挿入ソートを使用して、n個のレコードを持つファイルに対して、n-1本のソートを行います.
#include
#define N 10
int main()
{
              int i,j ,temp,a[N] = { 0, 5, 9, 3,2, 7, 6, 4, 1, 8 };
              for (int i = 1; ia[i])
                            {
                                          temp =a[i];
                                          for (j= i - 1; j >= 0 && a[j]>temp; j--)
                                          {//               ,        
                                                        a[j+ 1] = a[j];
                                          }
                                          a[j +1] = temp;//    a[j+1]=temp;
                            }
              }
              for (i= 0; i < 10; i++)
              {
                            printf("%3d",a[i]);
              }
              return 0;
}

//クイックソート
//概要:クイックソートはC.A.R.Hoareが1962年に提出した.基本的な考え方は
//1回のソートでソートするデータを独立した2つの部分に分割し、その一部のすべてのデータは他の部分のすべてのデータよりも小さく、
//そして、この方法でこの2つのデータをそれぞれ迅速にソートし、ソートプロセス全体を再帰的に行い、データ全体が秩序化されたシーケンスになるようにします.
#include
void sort(int a[],int left, int right)
{
              int i, j, t, temp;
              if (left > right)
                            return ;
 
              temp = a[left];
              i = left;
              j = right;
              if (i!= j)
              {
                            while (a[j] >temp && j > i)
                                          j--;
                            while (a[i] 

//並べ替え:
//概要:集計ソートは集計操作に確立された有効なソートアルゴリズムです.
//このアルゴリズムは、分割法(Divide and Conquer)を用いた非常に典型的な応用である.
//既存のシーケンスのサブシーケンスを結合し、完全に秩序化されたシーケンスを得る.すなわち、各サブシーケンスを秩序化してから、サブシーケンスセグメント間を秩序化する.
//2つの順序テーブルを1つの順序テーブルにマージする場合は、2ウェイ集計と呼ばれます.
#include
void mergesort(intarray[], int temparray[], int start_index, int end_index)
{
              int middle=(start_index+end_index)/2;
              int i = start_index, j = middle, k= start_index;
              if (start_index < end_index)
              {
                            mergesort(array,temparray,start_index,middle);
                            mergesort(array,temparray,middle+1,end_index);
                            while (i != middle&& j != end_index)
                            {
                                          if(array[i] < array[j])
                                                        temparray[k++]= array[i++];
                                          else
                                                        temparray[k++]= array[j++];
                            }
                            while (i != middle)
                            {
                                          temparray[k++]= array[i++];
                            }
                            while (j !=end_index)
                            {
                                          temparray[k++]= array[j++];
                            }
                            for (i =start_index; i < end_index; i++)
                            {
                                          array[i]= temparray[i];
                            }
              }
}
int main()
{
              int a[8] = { 50, 10, 20, 30, 70,40, 80, 60 };
              int i, b[8];
              mergesort(a, b, 0, 7);
              for (i = 0; i<8; i++)
              printf("%d ", a[i]);
              printf("
"); return 0; }

//基数ソート
//概要:基数ソート(radix sort)は「分配ソート(distribution sort)」に属し、
//「バケツ法」(bucket sort)やbin sortとも呼ばれ、その名の通りキー値の一部の情報を通じて、
//ソートする要素をいくつかの「バケツ」に割り当て、ソートの役割を果たすために、基数ソート法は安定性のあるソートに属します.
//その時間複雑度はO(nlog(r)m)であり、rは採用された基数であり、mはスタック数であり、場合によっては、
//基数ソート法の効率は他の安定性ソート法より高い.
#include
#include
//         
int getmax(int *a,int n)
{
              int max = a[0];
              for (int i = 1; i < n; i++)
              {
                            if (a[i]>max)
                                          max =a[i];
              }
              return max;
}
//        
int getlooptime(intmax)
{
              int count = 1;
              while (max / 10 != 0)
              {
                            max = max / 10;
                            count++;
              }
              return count;
}
 
//    2
void sort2(int *a,int n,int times)
{
              int b[10][10] = {};//              
              //   index   
              // 798   index=(798/1)%10=8
              //   index=(798/10)%10=9
              //   index=(798/100)%10=7
              //tempNum     1、10、100
              int tempnum = pow((float)10,times-1);
              int i, j;
              //        
              for (int i = 0; i < n;i++)
              {
                            int row_index = (*(a+ i) / tempnum)%10;
                            for (j = 0; j <10; j++)
                            {
                                          if(b[row_index][j] == NULL)
                                          {
                                                        b[row_index][j]= *(a + i);
                                                        break;
                                          }
                            }
              }
              //        
              int k = 0;
              for (i = 0; i < 10;i++)
              for (j = 0; j < 10; j++)
              {
                            if (b[i][j] != NULL)
                            {
                                          *(a +k) = b[i][j];
                                          b[i][j]= NULL;
                                          k++;
                            }
              }
 
}
//    1
void sort(int *a,int n)
{
              int max, sorttimes;
              max = getmax(a, n);
              sorttimes = getlooptime(max);
              printf("%d %d
", max,sorttimes); for (int i = 1; i <= sorttimes;i++) { sort2(a, n, i); } } int main() { int a[6] = { 5, 10, 123, 21, 11,1234 }; int n = sizeof(a) / sizeof(int);// sort(a,6); for (int i = 0; i < 6; i++) { printf("%d",a[i]); } return 0; }