技术支援:E:\資料\計算機\编程语言\数据结构
E:\資料\計算機\编程语言\数据结构3和计算机知识\pdf
E:\資料\計算機\编程语言\数据结构3和计算机知识\html
E:\資料\計算機\编程语言\数据结构算法-Visual C++ 6.0程序集
http://www.is.pku.edu.cn/~qzy/ds/docs/code/
1 桶排序
首先还是一个架构问题:
这样结构就可以编译:
--------------------Configuration: compositor - Win32 Debug--------------------
Compiling...
compositorm.cpp
compositorm.obj - 0 error(s), 0 warning(s)
error C2601: 'zeroBucket' : local function definitions are illegal
void collectElements(int[],int[][SIZE],int)
{}
int numberOfDigits(int b[],int arraySize)
{
int largest=b[0],digits=0;
for (int i=1;i<arraySize;++i)
if(b[i]>largest)
largest=b[i];
while(largest!=0)
{
++digits;
largest/=10;
} //就是在这个符号上少了导致的,今后注意
return digits;
}
void zeroBucket(int buckets[] [SIZE])
{
for (int i=0;i<10;++i)
for ( int j=0;j<SIZE;++j)
buckets[i][j]=0;
}
int numberOfDigits(int b[],int arraySize)//
{
int largest=b[0],digits=0;
for (int i=1;i<arraySize;++i)//既然没有赋值运算,所以++i和i++是一样,在这里
if(b[i]>largest)
largest=b[i];
while(largest!=0)
{
++digits;
largest/=10;//
}
return digits;
}
这个子函数的一些解析:
因为for没有用{ } 把while裹进去,所以,这两个是串行运算的.
largest就是最大值.
所以在while中 (largest!=0)
这个判决明显是一个数轴分界线,
对这个程式测试:
#include "stdio.h"
#define len 12
void main()
{ int largest;
int digits;
int i;
for( i=0;i<len;i++)
{
scanf("%d%d",&largest,&digits);
while(largest!=0)
{
++digits;
largest/=10;// /= 除法赋值符
printf(" %d,%d\n" ,digits,largest);
}
}
}
数据如下:
largest/=10;就是 等价于 largest=largest/10;
复合赋值运算符(combination assignment operator):+=、-=、*=、/=、%=。下面我们通过一些简单的例子学习这些复合赋值运算符的用法:
income += 300; 等同于 income = income + 300;
income -= 200; 等同于 income = income - 200;
income *= 0.1; 等同于 income = income * 0.1;
income /= 1.1; 等同于 income = income / 1.1;
reduce %= 3; 等同于 reduce = reduce % 3;
income += 200 + 100; 等同于 income = income + (200 + 100);
income *= 1 - 0.9; 等同于 income = income * (1 - 0.9);
income /= 2 * 1 - 0.9; 等同于 income = income / (2 * 1 - 0.9);
这样是出于编译原理的一些规范,简化代码.
所以,道理是一个样的.
所以这个程式段,目标是很明确是,那就是确定一个数的位数.
void collectElements(int a[],int buckets[][SIZE])
{
int subscript=0;
for(int i=0;i<10;++i)
for(int j=1;j<=buckets[i][0];++j)
{ a[subscript++]=buckets[i][j];}
}
bucket[0][0] | |||||||||||
bucket[1][0] | |||||||||||
bucket[2][0] | |||||||||||
bucket[3][0] | |||||||||||
bucket[4][0] | |||||||||||
bucket[5][0] | |||||||||||
bucket[6][0] | |||||||||||
bucket[7][0] | |||||||||||
bucket[8][0] | |||||||||||
bucket[9][0] |
测试代码:
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{ int i,j;
int digit;
int divisor;
for (j=0;j<10;j++)
{
scanf("%d",&digit);
divisor=10;
for (i=0;i<digit;++i)
{
divisor*=10;
printf("%d\n",divisor);
}
}
}
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
int divisor;
int a;
int bucketNumber;
int i;
for(i=0;i<13;i++)
{scanf("%d%d",&a,&divisor);
bucketNumber=( a%divisor-a%(divisor/10))/(divisor/10);
printf("%d\n",bucketNumber);
}
}
,
插入排序法和希尔排序法
先看自己编写结构代码一些问题:
#include<iostream.h>
#include<iomanip.h>
#include<stdlib.h>
//#define MAXI 11
typedef int KeyType;
typedef int ElemType;
typedef struct{
KeyType key;
ElemType data;
}RecordNode;
typedef struct{
int n;
RecorNode *record;
}SortObject;
void insertsort (SortObject *pvector)
{
}
void main()
{
}
Compiling...
insertsort.cpp
D:\software\C_installer\王贵歆个人工作文档\算法和数据结构\排序\insertsort1\insertsort.cpp(13) : error C2143: syntax error : missing ';' before '*'
D:\software\C_installer\王贵歆个人工作文档\算法和数据结构\排序\insertsort1\insertsort.cpp(13) : error C2501: 'RecorNode' : missing storage-class or type specifiers
D:\software\C_installer\王贵歆个人工作文档\算法和数据结构\排序\insertsort1\insertsort.cpp(13) : error C2501: 'record' : missing storage-class or type specifiers 就是一个简单的写错,就造成这样的错误
Error executing cl.exe.
insertsort.obj - 3 error(s), 0 warning(s)
#include<iostream.h>
#include<iomanip.h>
#include<stdlib.h>
//#define MAXI 11
typedef int KeyType;
typedef int ElemType;
typedef struct{
KeyType key;
ElemType data;
}RecordNode;
typedef struct{
int n;
RecordNode *record;
}SortObject;
void insertsort (SortObject *pvector)
{
}
void main()
{
}
--------------------Configuration: insertsort1 - Win32 Debug--------------------
Compiling...
insertsort.cpp
D:\software\C_installer\王贵歆个人工作文档\算法和数据结构\排序\insertsort1\insertsort.cpp(20) : error C2182: 'main' : illegal use of type 'void'
D:\software\C_installer\王贵歆个人工作文档\算法和数据结构\排序\insertsort1\insertsort.cpp(20) : error C2239: unexpected token '{' following declaration of 'main'
就是这样的一个( )缺省了,就造成这样错误.
Error executing cl.exe.
insertsort.obj - 2 error(s), 0 warning(s)
以上两个错误今后应该避免
完整代码:
#include<iostream.h>
#include<iomanip.h>
#include<stdlib.h>
//#define MAXI 11
typedef int KeyType;
typedef int ElemType;
typedef struct{
KeyType key;
ElemType data;
}RecordNode;
typedef struct{
int n;
RecordNode *record;
}SortObject;
void insertsort (SortObject *pvector)
{
}
void main()
{
}
/* 直接插入排序的算法源程序*/
#include<stdio.h>
#define MAXNUM 100
typedef int KeyType;
typedef int DataType;
typedef struct {
KeyType key; /* 排序码字段 */
/*DataType info; 记录的其它字段 */
} RecordNode;
typedef struct {
int n; /* n为文件中的记录个数,n<MAXNUM */
RecordNode record[MAXNUM];
} SortObject;
void insertSort(SortObject * pvector) { /* 按递增序进行直接插入排序 */
int i, j;
RecordNode temp;
RecordNode *data = pvector->record;
for( i = 1; i < pvector->n; i++ ) { /* 依次插入记录R1, R2…Rn-1 */
temp = data[i];
for ( j = i-1; temp.key < data[j].key && j >= 0; j-- )
/* 由后向前找插入位置 将排序码大于ki的记录后移 */
data[j+1] = data[j];
if( j != i-1 ) data[j+1] = temp;
}
}
SortObject vector = {10,
49, 38, 65, 97, 76, 13, 27, 49, 50, 101};
int main(){
int i;
insertSort(&vector);
for(i = 0; i < vector.n; i++)
printf("%d ", vector.record[i]);
getchar();
return 0;
}
自己的一些错误:
int n=MAXI;
int a[n];//error C2057: expected constant expression
改为 int a[MAXI]
要用到 srand(time(0));必须用到 #include<time.h>
到最后 报warning:
warning C4700: local variable 'a' used without having been initialized