分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
各种基本算法实现小结(五)—— 排序算法
(均已测试通过)
* 选择排序 |____简单选择排序 |____堆排序 |____归并排序
* 交换排序 |____冒泡排序 |____快速排序
* 插入排序 |____直接插入排序 |____折半排序 |____希尔排序
* 分配排序 |____箱排序 |____基数排序
======================================================================
简单排序算法
1、 冒泡排序
测试环境:VC 6.0 (C)
- #include
- <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #define MAX 11
- void input(int num[])
- {
- int i;
- srand((unsigned)time(NULL));
- for(i=1; i<MAX; i++)
- num[i]=rand()%100;
- }
- void output(int num[])
- {
- int i;
- for(i=1; i<MAX; i++)
- {
- printf("%5d", num[i]);
- if(0 == i%10)
- printf("/n");
- }
- printf("/n");
- }
- void sort(int num[])
- {
- int i, j, tmp;
- for(i=1; i<MAX-1; i++)
- {
- printf("bubble.../n");
- for(j=1; j<MAX-i; j++)
- {
- printf("%5d", num[j]);
- if(num[j]>num[j+1])
- {
- tmp=num[j];
- num[j]=num[j+1];
- num[j+1]=tmp;
- }
- }
- printf("%5d/n", num[MAX-i]);
- printf("bubble after.../n");
- for(j=1; j<MAX; j++)
- printf("%5d", num[j]);
- printf("/n");
- }
- }
- /* bubble sort */
- /*
- void sort(int num[])
- {
- int i, j, tmp;
- for(i=1; i<MAX-1; i++)
- {
- for(j=1; j<MAX-i; j++)
- if(num[j]>num[j+1])
- {
- tmp=num[j];
- num[j]=num[j+1];
- num[j+1]=tmp;
- }
- }
- }
- */
- void main()
- {
- int num[MAX];
- printf("sort before.../n");
- input(num);
- output(num);
- sort(num);
- printf("sort after.../n");
- output(num);
- }
运行结果:
=======================================================
2、双向冒泡排序
据说可以提高效率,减少比较次数和交换次数
但仔细分析可得,每次while循环,都for循环比较了两次
因此每次low和high各减1,总体上比较次数并未减少,两次for交换也未减少
个人认为双向冒泡算法并未有效的减少比较次数和交换次数,但此算法也富含编程思想,值得学习
测试环境:VC 6.0 (C)
- #include
- <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #define swap(x, y){int tmp; tmp=x; x=y; y=tmp;}
- #define MAX 11
- void input(int num[])
- {
- int i;
- srand((unsigned)time(NULL));
- for(i=1; i<MAX; i++)
- num[i]=rand()%100;
- }
- void output(int num[])
- {
- int i;
- for(i=1; i<MAX; i++)
- {
- printf("%5d", num[i]);
- if(0 == i%10)
- printf("/n");
- }
- }
- void sort(int num[], int low, int high)
- {
- int i;
- while(low<high)
- {
- for(i=low; i<high; i++) /* bubble to high */
- if(num[i]>num[i+1])
- swap(num[i], num[i+1]);
- high--;
- for(i=high; i>low; i--) /* bubble to low */
- if(num[i]<num[i-1])
- swap(num[i], num[i-1]);
- low++;
- }
- }
- void main()
- {
- int num[MAX];
- input(num);
- printf("sort before.../n");
- output(num);
- sort(num, 1, MAX-1);
- printf("sort after.../n");
- output(num);
- }
运行结果:
=======================================================
3、选择排序
测试环境:VC 6.0 (C)
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #define MAX 101
- void input(int num[])
- {
- int i;
- srand((unsigned)time(NULL));
- for(i=1; i<MAX; i++)
- num[i]=rand()%100;
- }
- void output(int num[])
- {
- int i;
- for(i=1; i<MAX; i++)
- {
- printf("%5d", num[i]);
- if(0 == i%10)
- printf("/n");
- }
- printf("/n");
- }
- void sort(int num[])
- {
- int i, j, k, tmp;
- for(i=1; i<MAX-1; i++)
- {
- k=i;
- for(j=i+1; j<MAX; j++)
- if(num[k]>num[j])
- k=j;
- if(i<k)
- {
- tmp=num[i];
- num[i]=num[k];
- num[k]=tmp;
- }
- }
- }
- void main()
- {
- int num[MAX];
- printf("sort before.../n");
- input(num);
- output(num);
- sort(num);
- printf("sort after.../n");
- output(num);
- }
运行结果:
=======================================================
中级排序算法
向部分已排好序数列插入新值,使整个数列最终都有序
1、直接插入排序
测试环境:VC 6.0 (C)
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #define MAX 11
- void input(int num[])
- {
- int i;
- srand((unsigned)time(NULL));
- for(i=1; i<MAX; i++)
- num[i]=rand()%100;
- }
- void output(int num[])
- {
- int i;
- for(i=1; i<MAX; i++)
- {
- printf("%5d", num[i]);
- if(0 == i%10)
- printf("/n");
- }
- printf("/n");
- }
- void sort(int num[])
- {
- int i, pos, tmp;
- for(i=2; i<MAX; i++) /* from 2 to sorting */
- {
- pos=i;
- tmp=num[pos];
- while(pos>1 && tmp<num[pos-1])
- {
- num[pos]=num[pos-1];
- pos--;
- }