#include <stdio.h>
#include <stdlib.h>
void insertSort(int a[],int count) /*count为排序数字个数*/
{
int i,j,temp;
for(i=1;i<count;i++) /*依次插入数字到它前面已经排好序的数字中去*/
{
temp=a[i];
j=i-1;
while(a[j]>temp && j>=0) /* 查找插入元素位置 */
{
a[j+1]=a[j];
j--;
}
if(j!=(i-1)) /*判定是否需要重新插入*/
{
a[j+1]=temp;
}
}
}
void selectSort(int a[],int count)
{
int i,j,min,temp;
for(i=0;i<count-1;i++)
{
min=i; // 假定第一个数最小,记录其下标
for(j=i+1;j<count;j++)
{
if(a[j]<a[min]) min=j; // 有更小的数,替换其最小值下标。
}
if(min!=i) // 判断是否需要交换
{
temp=a[min];
a[min]=a[i];
a[i]=temp;
}
}
}
void BibleSort(int a[],int count)
{
int i,j,temp;
for(i=0;i<count-1;i++)
{
for(j=i+1;j<count;j++)
{
if(a[j]<a[i]) // 判断是否需要交换
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
int split(int a[],int left,int right)
{
int i,j,temp;
i=left, j=right, temp=a[left]; //保存第1个元素
while(i!=j)/*遍历整个数组*/
{
while(a[j]>=temp && j>i) j--;
if(j>i) a[i++]=a[j]; //将右侧大的数据放到左边
while(a[i]<=temp && j>i) i++;
if(j>i) a[j--]=a[i]; //将左侧大的数据放到右边
}
a[i]=temp; /*找到该元素最终位置*/
return i; /* 返回分界点 */
}
void quickSort(int a[],int left,int right)
{
int s;
if(left>right) return;
s=split(a,left,right); /* 分治 */
quickSort(a,left,s-1);/*递归左边*/
quickSort(a,s+1,right);/*递归右边*/
}
int BinarySearch(int a[], int x,int n)
{
int left=0;
int right=n-1;
while(left<=right){
int middle=(left+right)/2;
if (x==a[middle]) return middle;
if (x>a[middle]) left=middle+1;
else right=middle-1;
}
return -1;
}
void printresult(int a[],int size)
{
int i;
for(i=0;i<size;i++)
{
printf("%d ",a[i]);
}
printf("/n");
}
int main(void)
{
int a[9]={6,3,2,9,4,8,7,5,1};
// BibleSort(a,9);
// printresult(a,9);
// selectSort(a,9);
// printresult(a,9);
// insertSort(a,9);
// printresult(a,9);
quickSort(a,0,9);
printresult(a,9);
}
名称hash, 我喜欢用这个, 很好。
unsigned int namehash(const char *name)
{
unsigned int hash = 1315423911;
int len=strlen(name);
int i;
for(i=0; i<len; i++)
{
hash ^= (hash << 5) + name[i] + (hash>>2);
}
return hash & HASH_TABLESIZE;
}