排序(冒泡、插入、選擇、希爾)之c語言完成實現(編譯-運行-查看結果)

排序原理及算法複雜度計算見“經典排序算法及時間複雜度計算-c語言-動畫演示”,鏈接:https://blog.csdn.net/yq272393925/article/details/89132353

以下內容爲c語言實現乾貨,在linux平臺下編譯運行並查看結果。

0.編譯及運行腳本(build.sh)

執行 sh build.sh ,輸入排序數據數量,即可運行查看結果

#!/bin/bash
clean=$1

if [ "$clean" = "clean" ]
then
    rm -rf *.txt
    rm -rf a.out
    exit
fi

if [ "$1" = "-g" ]
then
    gcc -g sort.c utils.c -o mysort
    exit
fi
    
gcc sort.c utils.c -o mysort
./mysort

md5sum *txt

 

1.util.h

#include <stdio.h>
#define ASC 0
#define DESC 1
#define DATA_SCOPE 100
void data2file(int *data,int len, char *filename);
void gendata(int n, int *data);
void bubble_sort(int *data, int len,int typeflag);
void select_sort(int *data, int len,int typeflag);
void insert_sort(int *data, int len,int typeflag);
void insert_sort_good(int *data, int len,int typeflag);

 

2.utils.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "util.h"
void swap(int *a, int *b)
{
   int tmp = -1;
   tmp = *a;
   *a = *b;
   *b =tmp;
}

void bubble_sort(int *data, int len,int typeflag)
{
    int i = 0;
    int j = 0;
    int tmp = -1;
    
    for(i = 0; i < len; i++)
    {
        for(j = 0; j < len - i - 1; j++)
        {
             if(typeflag==ASC && data[j] > data[j+1])
                 swap(data+j,data+j+1);            
             if(typeflag==DESC && data[j] < data[j+1])
                 swap(&data[j],&data[j+1]);
        }
    }


}

void select_sort(int *data, int len,int typeflag)
{
    int i = 0;
    int j = 0;
    int idx = -1;
    for(i = 0; i < len -1 ; i++){
        idx = i+1 ;
        for(j = i ; j < len ; j++){
            
            if(typeflag==ASC && data[idx] > data[j])
                idx = j;
            if(typeflag==DESC && data[idx] < data[j])
                idx = j;
        }
        if(idx != i)
           swap(data+i,data+idx);
    }

}


void insert_sort(int *data, int len,int typeflag)
{
    int i = 0;
    int j = 0;
    int k = 0;
    int tmpmax = -1;
    int idx = -1;
    for(i=0; i<len-1; i++){

        idx = -1;
        for(j=0; j<i+1 ;j++){
            if(typeflag == ASC && data[i+1] < data[j] ){            
                idx = j;               
                break ;
            }
            if(typeflag == DESC && data[i+1] > data[j] ){            
                idx = j;               
                break ;
            }
        }

        if(idx == -1)
            continue ;
        else{
           tmpmax = data[i+1];
           for(k = i+1; k>idx;k--){               
               data[k]=data[k-1];              
           }
           data[idx] = tmpmax;
        }
    }

}

void insert_sort_good(int *data, int len,int typeflag)
{
    int i = 0;
    int preindex = 0;
    int k = 0;
    int current = -1;
    int idx = -1;
    for(i=0; i<len-1; i++){

        idx = -1;
        current = data[i+1];
        preindex = i;
        while(preindex >=0){
            if( (typeflag == ASC && current < data[preindex] )  ||
                (typeflag == DESC && current > data[preindex] )   )
            {           
                data[preindex+1] = data[preindex];
                preindex--;
                continue;                 
            }
            break;
        }
        data[preindex+1] = current;       
    }

}

void shell_sort(int *data, int len, int typeflag)
{
    int current = -1;
    int preindex = -1;
    int i = 0,j = 0;
    int gap = 0;
    gap = len/2;
    while(gap > 0){
        for(i = gap; i<len; i++){
            current = data[i];
            preindex = i-gap;
            while(preindex >=0) {
                if( (typeflag == ASC && current < data[preindex] )  ||
                    (typeflag == DESC && current > data[preindex] )   )
                {           
                    data[preindex+gap] = data[preindex];  
                    preindex = preindex-gap;
                    continue;   
                }
                break;
                 
            }
            data[preindex+gap] = current;
        }
        gap = gap/2;
    }
    

}

void data2file(int *data,int len, char *filename)
{
   FILE *fp = NULL;
   int i = 0;   
   if((fp=fopen(filename,"w"))==NULL)
   {
       printf("file cannot open \n");
       exit(0);  
       //頭文件#include <stdlib.h>
       //exit結束程序,一般0爲正常推出,其它數字爲異常,其對應的錯誤可以自己指定。
   }

   
   fprintf(fp,"%d\n",len);

   for(i = 0; i < len; i++)
   {
       if((i+1)%10 == 0 )
         fprintf(fp,"%6d \n",data[i]);
       else
         fprintf(fp,"%6d ",data[i]);
   }

   if(fclose(fp)!=0)
       printf("file cannot be closed \n");
   else
       printf("file is now closed \n");
}

void gendata(int n, int *data)
{
   int i = 0;
   srand((unsigned)time(NULL));
   
   for(i=0;i<n;i++)
       data[i] = rand()%DATA_SCOPE;
}

3.sort.c

#include <stdio.h>
#include "util.h"
void main()
{
   int count = 0;
   int n = 0;
   int *org = 0x0;
   int *sort = 0x0;
   printf("本程序隨機生成n個整型數據至data.txt中,請選擇如下排序算法,對數據進行排序\n");

   printf("\n");
   printf("----------------------------------------------------------\n");
   printf("\n");
   printf("隨機產生n個整數(0-100000)至data.txt文件\n");
   printf("\n");
   printf("數據格式首行單個數字,表示數據中整數的個數\n");
   printf("\n");
   printf("其餘行每行10個整數\n");
   printf("----------------------------------------------------------\n");
   printf("\n");

   printf("輸入隨機數數量:%d\n",n);
   scanf("%d",&n);

   //1.生成原始數據   
   org =  (int *)malloc(n * sizeof(int));
   memset(org, 0, n * sizeof(int));

   gendata(n, org);
   data2file(org,n,"org.txt");

   sort =  (int *)malloc(n * sizeof(int));
   memset(sort, 0, n * sizeof(int));    
    
   //2.冒泡排序
   memcpy(sort,org,n * sizeof(int));  
   bubble_sort(sort, n, ASC);
   data2file(sort,n,"bubble_sort.txt");

   //3.選擇排序
   memcpy(sort,org,n * sizeof(int));
   select_sort(sort, n, ASC);
   data2file(sort,n,"select_sort.txt");

   //4.插入排序,兩步驟
   memcpy(sort,org,n * sizeof(int));
   insert_sort(sort, n, ASC);
   data2file(sort,n,"insert_sort.txt");

   //5.插入排序,while循環
   memcpy(sort,org,n * sizeof(int));
   insert_sort_good(sort, n, ASC);
   data2file(sort,n,"insert_sort_good.txt");

   //6.希爾排序,while循環
   memcpy(sort,org,n * sizeof(int));
   shell_sort(sort, n, ASC);
   data2file(sort,n,"shell_sort.txt");

   free(org);
   org = 0;
   free(sort);
   sort = 0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章