满脑子都是阶段/状态/决策……学无止境呀
发一点基本的排序算法,分成很多个文件写的,每个文件前面带了注释,一起发出来,结构如下:
Sort.h | 头文件 |
main.c | 主演示程序 |
printkeys.c | 数据输出 |
ifcontinue.c | 演示控制 |
random.c | 随机初始化数据 |
bubblesort.c | 冒泡排序算法 |
quicksort.c | 快速排序算法 |
insort.c | 插入排序算法 |
shellsort.c | 希尔排序算法 |
演示按 随机化数据->输出->排序->输出 的流程进行,算法很简单不想多说。
/**/
/* sort.h: 排序算法演示头文件 */
#include < stdio.h >
#define MAXN 100
typedef struct
... {
int key;
int data;
} Record;
/**/ /*
几种排序算法演示
by DaNmarner
Email: DaNmarner@gmail.com
*/
#include " sort.h "
int Random(Record r[], int n);
int printkeys(Record r[], int n);
int ifcontinue( void );
void InsSort (Record r[], int n);
void ShellSort (Record[], int n);
void BubbleSort(Record r[], int n);
void QuickSort (Record r[], int s, int t);
int main( void )
... {
Record r[MAXN];
int n=10;
printf ("Show sorts by DaNmarner 2006.4 ");
printf ("How much record to be sorted ( n<100 ) ?");
scanf ("%d",&n);
puts("");
//演示插入排序
puts("InsSort ready! ");
ifcontinue();
Random(r,n);
puts("Before InsSort:");
printkeys(r,n);
InsSort(r,n);
puts("After InsSort:");
printkeys(r,n);
puts("");
//插入排序结束
//演示希尔排序
puts("ShellSort ready! ");
ifcontinue();
Random(r,n);
puts("Before ShellSort:");
printkeys(r,n);
ShellSort(r,n);
puts("After ShellSort:");
printkeys(r,n);
puts("");
//希尔排序结束
//演示冒泡排序
puts("BubbleSort ready! ");
ifcontinue();
Random(r,n);
puts("Before BubbleSort:");
printkeys(r,n);
BubbleSort(r,n);
puts("After BubbleSort:");
printkeys(r,n);
puts("");
//冒泡排序结束
//演示快速排序
puts("QuickSort ready! ");
ifcontinue();
Random(r,n);
puts("Before QuickSort:");
printkeys(r,n);
QuickSort(r,0,n-1);
puts("After QuickSort:");
printkeys(r,n);
puts("");
//演示快速结束
//演示堆排序
puts("HeapSort ready! ");
ifcontinue();
Random(r,n);
puts("Before HeapSort:");
printkeys(r,n);
QuickSort(r,0,n-1);
puts("After HeapSort:");
printkeys(r,n);
puts("");
//演示堆结束
system("PAUSE");
return 0;
}
/**/ /* printkeys.c: 输出排序关键字 */
#include " sort.h "
int printkeys (Record r[], int n)
... {
int i;
for (i=0;i<n;i++)
printf("%d ",r[i].key);
printf (" ");
return i;
}
/**/ /* ifcontinue.c: 控制是否继续演示 */
#include < stdio.h >
#include < stdlib.h >
int ifcontinue( void )
... {
int c;
puts("Press any key to continue, q to quit... ");
if ((c=getchar())=='q') exit(1);
}
/**/ /* random.c: 用随机数给r[0].key-r[n-1].key赋值 */
#include < stdlib.h >
#include < time.h >
#include " sort.h "
int Random (Record r[], int n)
... {
int i;
srand(time(NULL));
for (i=0;i<n;i++)
r[i].key=rand();
return n;
}
/**/ /* bubblesort.c: 演示冒泡排序 */
#include " sort.h "
void BubbleSort(Record r[], int n)
... {
int i,j,done=0;
Record tmp;
for (i=0; !done && i<n; i++)...{
done=1;
for (j=1;j<n-i;j++)
if (r[j-1].key>r[j].key)...{
tmp=r[j-1];
r[j-1]=r[j];
r[j]=tmp;
done=0;
}
}
}
/**/ /* quicksort.c 快速排序算法 */
#include " sort.h "
void QuickSort (Record r[], int s, int t)
... {
int low=s;
int high=t;
Record pivot;
pivot=r[s];
while (low<high)...{
while (low<high && r[high].key>pivot.key)
high--;
if (low<high) r[low++]=r[high];
while (low<high && r[low].key<pivot.key)
low++;
if (low<high) r[high--]=r[low];
}
r[low]=pivot;
if (s<low) QuickSort(r,s,low-1);
if (t>high) QuickSort(r,high+1,t);
}
/**/ /* inssort.c: 插入排序算法 */
#include " sort.h "
void InsSort (Record r[], int n)
... {
int i,j;
Record tmp;
for (i=1;i<n;i++) ...{
tmp=r[i];
for (j=i-1; j>=0 && tmp.key < r[j].key; j--)
r[j+1]=r[j];
r[j+1]=tmp;
}
}
/**/ /* shellsort.c: 希尔排序算法*/
#include " sort.h "
void ShellSort (Record r[], int n)
... {
int i,j,dk=n/2;
Record tmp;
while (dk > 0) ...{
for (i=dk;i<n;i++) ...{
tmp=r[i];
for (j=i-dk;j>=0 && tmp.key<r[j].key;j-=dk)
r[j+dk]=r[j];
r[j+dk]=tmp;
}
dk/=2;
}
}
#include < stdio.h >
#define MAXN 100
typedef struct
... {
int key;
int data;
} Record;
/**/ /*
几种排序算法演示
by DaNmarner
Email: DaNmarner@gmail.com
*/
#include " sort.h "
int Random(Record r[], int n);
int printkeys(Record r[], int n);
int ifcontinue( void );
void InsSort (Record r[], int n);
void ShellSort (Record[], int n);
void BubbleSort(Record r[], int n);
void QuickSort (Record r[], int s, int t);
int main( void )
... {
Record r[MAXN];
int n=10;
printf ("Show sorts by DaNmarner 2006.4 ");
printf ("How much record to be sorted ( n<100 ) ?");
scanf ("%d",&n);
puts("");
//演示插入排序
puts("InsSort ready! ");
ifcontinue();
Random(r,n);
puts("Before InsSort:");
printkeys(r,n);
InsSort(r,n);
puts("After InsSort:");
printkeys(r,n);
puts("");
//插入排序结束
//演示希尔排序
puts("ShellSort ready! ");
ifcontinue();
Random(r,n);
puts("Before ShellSort:");
printkeys(r,n);
ShellSort(r,n);
puts("After ShellSort:");
printkeys(r,n);
puts("");
//希尔排序结束
//演示冒泡排序
puts("BubbleSort ready! ");
ifcontinue();
Random(r,n);
puts("Before BubbleSort:");
printkeys(r,n);
BubbleSort(r,n);
puts("After BubbleSort:");
printkeys(r,n);
puts("");
//冒泡排序结束
//演示快速排序
puts("QuickSort ready! ");
ifcontinue();
Random(r,n);
puts("Before QuickSort:");
printkeys(r,n);
QuickSort(r,0,n-1);
puts("After QuickSort:");
printkeys(r,n);
puts("");
//演示快速结束
//演示堆排序
puts("HeapSort ready! ");
ifcontinue();
Random(r,n);
puts("Before HeapSort:");
printkeys(r,n);
QuickSort(r,0,n-1);
puts("After HeapSort:");
printkeys(r,n);
puts("");
//演示堆结束
system("PAUSE");
return 0;
}
/**/ /* printkeys.c: 输出排序关键字 */
#include " sort.h "
int printkeys (Record r[], int n)
... {
int i;
for (i=0;i<n;i++)
printf("%d ",r[i].key);
printf (" ");
return i;
}
/**/ /* ifcontinue.c: 控制是否继续演示 */
#include < stdio.h >
#include < stdlib.h >
int ifcontinue( void )
... {
int c;
puts("Press any key to continue, q to quit... ");
if ((c=getchar())=='q') exit(1);
}
/**/ /* random.c: 用随机数给r[0].key-r[n-1].key赋值 */
#include < stdlib.h >
#include < time.h >
#include " sort.h "
int Random (Record r[], int n)
... {
int i;
srand(time(NULL));
for (i=0;i<n;i++)
r[i].key=rand();
return n;
}
/**/ /* bubblesort.c: 演示冒泡排序 */
#include " sort.h "
void BubbleSort(Record r[], int n)
... {
int i,j,done=0;
Record tmp;
for (i=0; !done && i<n; i++)...{
done=1;
for (j=1;j<n-i;j++)
if (r[j-1].key>r[j].key)...{
tmp=r[j-1];
r[j-1]=r[j];
r[j]=tmp;
done=0;
}
}
}
/**/ /* quicksort.c 快速排序算法 */
#include " sort.h "
void QuickSort (Record r[], int s, int t)
... {
int low=s;
int high=t;
Record pivot;
pivot=r[s];
while (low<high)...{
while (low<high && r[high].key>pivot.key)
high--;
if (low<high) r[low++]=r[high];
while (low<high && r[low].key<pivot.key)
low++;
if (low<high) r[high--]=r[low];
}
r[low]=pivot;
if (s<low) QuickSort(r,s,low-1);
if (t>high) QuickSort(r,high+1,t);
}
/**/ /* inssort.c: 插入排序算法 */
#include " sort.h "
void InsSort (Record r[], int n)
... {
int i,j;
Record tmp;
for (i=1;i<n;i++) ...{
tmp=r[i];
for (j=i-1; j>=0 && tmp.key < r[j].key; j--)
r[j+1]=r[j];
r[j+1]=tmp;
}
}
/**/ /* shellsort.c: 希尔排序算法*/
#include " sort.h "
void ShellSort (Record r[], int n)
... {
int i,j,dk=n/2;
Record tmp;
while (dk > 0) ...{
for (i=dk;i<n;i++) ...{
tmp=r[i];
for (j=i-dk;j>=0 && tmp.key<r[j].key;j-=dk)
r[j+dk]=r[j];
r[j+dk]=tmp;
}
dk/=2;
}
}