1.0 快速排序
- //快速排序
-
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
- void quick_sort(int s[], int l, int r)
- {
- if (l < r)
- {
- //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
- int i = l, j = r, x = s[l];
- while (i < j)
- {
- while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
- j--;
- if(i < j)
- s[i++] = s[j];
- while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
- i++;
- if(i < j)
- s[j--] = s[i];
- }
- s[i] = x;
- quick_sort(s, l, i - 1); // 递归调用
- quick_sort(s, i + 1, r);
- }
- }
2.0 折半查找(二分查找)
int binary_search(const int arr[],int low,int high,int key)
{
int mid=low+(high-low)/2;
if
(low>high)
return
-1;
else
{
if
(arr[mid]==key)
return mid;
else if(arr[mid]>key)
return binary_search(arr,low,mid-1,key);
else
return binary_search(arr,mid+1,high,key);
}
}
3.0 遍历二叉树
递归遍历
- void preorder(bintree t){
- if(t){
- printf("%c ",t->data);
- preorder(t->lchild);
- preorder(t->rchild);
- }
- }
非递归遍历
- #define SIZE 100
- typedef struct seqstack{
- bintree data[SIZE];
- int tag[SIZE]; //为后续遍历准备的
- int top; //top为数组的下标
- }seqstack;
- void push(seqstack *s,bintree t){
- if(s->top == SIZE){
- printf("the stack is full\n");
- }else{
- s->top++;
- s->data[s->top]=t;
- }
- }
- bintree pop(seqstack *s){
- if(s->top == -1){
- return NULL;
- }else{
- s->top--;
- return s->data[s->top+1];
- }
- }
层次遍历
一)生成队列:
- #define MAX 1000
- typedef struct seqqueue{
- bintree data[MAX];
- int front;
- int rear;
- }seqqueue;
- void enter(seqqueue *q,bintree t){
- if(q->rear == MAX){
- printf("the queue is full!\n");
- }else{
- q->data[q->rear] = t;
- q->rear++;
- }
- }
- bintree del(seqqueue *q){
- if(q->front == q->rear){
- return NULL;
- }else{
- q->front++;
- return q->data[q->front-1];
- }
- }
二)便利实现:
- void level_tree(bintree t){
- seqqueue q;
- bintree temp;
- q.front = q.rear = 0;
- if(!t){
- printf("the tree is empty\n");
- return ;
- }
- enter(&q,t);
- while(q.front != q.rear){
- t=del(&q);
- printf("%c ",t->data);
- if(t->lchild){
- enter(&q,t->lchild);
- }
- if(t->rchild){
- enter(&q,t->rchild);
- }
- }
- }
4.0 二叉树查找
- bintree search_tree(bintree t,datatype x){
- if(!t){
- return NULL;
- }
- if(t->data == x){
- return t;
- }else{
- if(!search_tree(t->lchild,x)){
- return search_tree(t->rchild,x);
- }
- return t;
- }
- }
5.0 冒泡排序
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
void bubble_sort(inta[],int n);
void bubble_sort(int a[],int n)
//n为数组a的元素个数
{
int i,j,temp;
for
(j=0;j<n-1;j++)
for
(i=0;i<n-1-j;i++)
{
if
(a[i]>a[i+1])
//数组元素大小按升序排列
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
int main()
{
int number[SIZE]={95,45,15,78,84,51,24,12};
int i;
bubble_sort(number,SIZE);
for
(i=0;i<SIZE;i++)
{
printf
(
"%d"
,number[i]);
}
printf
(
"\n"
);
}
6.0 堆排序
1.0) 初始化操作:将R[1..n]构造为初始堆;
2.0)每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)
//本函数功能是:根据数组array构建大根堆
void
HeapAdjust(
int
array[],
int
i,
int
nLength)
{
int
nChild;
int
nTemp;
for
(;2*i+1<nLength;i=nChild)
{
//子结点的位置=2*(父结点位置)+1
nChild=2*i+1;
//得到子结点中较大的结点
if
(nChild<nLength-1&&array[nChild+1]>array[nChild])
++nChild;
//如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点
if
(array[i]<array[nChild])
{
nTemp=array[i];
array[i]=array[nChild];
array[nChild]=nTemp;
}
else
//否则退出循环
break
;
}
}
//堆排序算法
void HeapSort(int array[],int length)
{
int tmp;
//调整序列的前半部分元素,调整完之后第一个元素是序列的最大的元素
//length/2-1是最后一个非叶节点,此处"/"为整除
for
(int i=length/2-1;i>=0;--i)
HeapAdjust(array,i,length);
//从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素
for
(int i=length-1;i>0;--i)
{
//把第一个元素和当前的最后一个元素交换,
//保证当前的最后一个位置的元素都是在现在的这个序列之中最大的
///Swap(&array[0],&array[i]);
tmp=array[i];
array[i]=array[0];
array[0]=tmp;
//不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值
HeapAdjust(array,0,i);
}
}