1.排序:
内部排序:
交换排序:冒泡排序,快排;
选择排序:选择,堆排;
插入排序: 插入;
外部排序:归并排序;
2.快速排序;
3.二叉树:
非线性:
完全二叉树: --满二叉树
4.累堆排序:
1)创建大根堆;
2)交换到最后的位置;
3)其余的前面就绪创建大根堆
4)交换;
5.多关键字排序:利用空间换取时间:
6.归并排序:
基数排序
库函数:quick_sort();
程序1:快速排序:
/*
*wuxiuwen
* 快速排序
*20120825
*/
#include<stdio.h>
void sort_kuaisu(int data[],int,int);
void swap(int data[],int,int);
int main()
{
int a[]={4,3,5,6,7,1,7,2,9,3,6,10};
int len = sizeof(a)/sizeof(a[0])-1;
sort_kuaisu(a,0,len);
int i;
for(i=0;i<=len;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
void swap(int data[],int i,int j)
{
int temp;
temp = data[i];
data[i]=data[j];
data[j]=temp;
}
void sort_kuaisu(int data[],int left,int right)
{
int l = left;
int r = right;
int k =left;
while(l < r)
{
while(l < r && data[k] < data[r])
{
r--;
}
if(data[k] >= data[r])
{
swap(data,k,r);
k=r;
}
while(l < r && data[k] >= data[l])
{
l++;
}
if(data[k] < data[l])
{
swap(data,k,l);
k=l;
}
if(left < (k-1))
sort_kuaisu(data,left,k-1);
if(right > (k+1))
sort_kuaisu(data,k+1,right);
}
}
执行结果:
[root@localhost Desktop]# gcc 4.c
[root@localhost Desktop]# ./a.out
1 2 3 3 4 5 6 6 7 7 9 10
[root@localhost Desktop]#
程序2:
/*
*wuixuwen
* heapsort
*利用完全二插树进行堆排序
*20120825
*
*/
#include<stdio.h>
void heapsort(int data[],int);
void sort_kuaisu(int data[],int,int);
void swap(int data[],int,int);
int main()
{
int a[]={0,4,3,5,6,7,1,7,2,9,3,6,10}; //有效数组的内容是从4开始
int len = sizeof(a)/sizeof(a[0])-1;
//sort_kuaisu(a,0,len);
heapsort(a,len);
int i;
for(i=0;i<=len;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
void creatheap(int data[],int root,int index)
//index是下标,root是父节点
{
int j= root*2;
int temp=data[root];
while(j<= index)
{
if(j<index)
if(data[j]<data[j+1]) //两个孩子比较
j++;
if(temp <data[j]) //大的孩子和父比较
{
data[j/2] = data[j];
j=j*2;
}
else break;
}
data[j/2]=temp;
}
void heapsort(int data[],int len) //len=13,index =12
{
int i;
int index =len-1;
for(i=index/2;i>=1;i--)
{
creatheap(data,i,index);
}
for(i=index;i>1;i--)
{
swap(data,1,i);
creatheap(data,1,i-1);
}
}
void swap(int data[],int i,int j)
{
int temp;
temp = data[i];
data[i]=data[j];
data[j]=temp;
}
void sort_kuaisu(int data[],int left,int right)
{
int l = left;
int r = right;
int k =left;
while(l < r)
{
while(l < r && data[k] < data[r])
{
r--;
}
if(data[k] >= data[r])
{
swap(data,k,r);
k=r;
}
while(l < r && data[k] >= data[l])
{
l++;
}
if(data[k] < data[l])
{
swap(data,k,l);
k=l;
}
if(left < (k-1))
sort_kuaisu(data,left,k-1);
if(right > (k+1))
sort_kuaisu(data,k+1,right);
}
}
[root@localhost Desktop]# gcc 5.c
[root@localhost Desktop]# ./a.out
0 1 2 3 3 4 5 6 6 7 7 9 10
[root@localhost Desktop]#
*********************************************************************************************