排序原理及算法複雜度計算見“經典排序算法及時間複雜度計算-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;
}