/*
排序算法分析和比较
选择法排序:选择法排序在排序过程中一共需要进行n(n-1)/2次比较,互相交换n-1次,选择法排序简单、容易实现,适用于数量较小的排序
冒泡法排序:最好的情况是正序,因此只需要比较即可,最坏的情况是逆序,需要比较n^2次,冒泡法排序是最稳定的排序方法,当待排序列有序时,效果比较好
交换法排序:交换法排序和冒泡法排序类似,正序时最快,逆序时最慢,排序有序数据时效果比较好
插入法排序:此算法需要经过n-1次插入过程,如果数据恰好应该插入到序列的最后端,则不需要移动数据,可节省时间,因此若原始数据基本有序,此算法具有较快的运算速度
折半法排序:折半法排序对于较大的n时,是速度最快的排序算法,但当n很小时,此方法往往比其他排序算法还要慢,折半法排序是不稳定的,对应有相同关键字的记录,排序后的结果可能会颠倒次序
建议
插入法,冒泡法,交换法排序的速度较慢,但参加排序的序列局部或整体有序时,这3种排序能达到较快的速度,在这种情况下,折半法排序反而会显得速度慢了,当n(需要排序元素的数量)较小时,对稳定性不做要求时宜用选择法排序,对稳定性有要求时宜用插入法或冒泡法排序
*/
/*
选择排序
首先选出最值(最大或最小值),然后拿这个最值和第一个值进行位置互换,然后拿第二个最值和第二个值进行位置互换,依此类推,每次拿剩余的最值和其他的值进行位置互换,直到排序完毕
*/
#include <stdio.h>
int main()
{
int i,j;
int a[10];
int iIemp;
int iPos;
printf("为数组元素赋值:\n");
/*从键盘输入,为数组元素赋值*/
for(i=0;i<10;i++)
{
printf("a[%d]",i);
scanf("%d",&a[i]);
}
/*将上面赋值过的数组进行从高到底的排序*/
for(i=0;i<9;i++)
{
iIemp = a[i]; /*设置当前的值为最大的值*/
iPos = i; /*记录当前的位置*/
/*循环一遍数组,找到最大值,然后记录位置*/
for(j=i+1;j<10;j++)
{
if(a[j]>iIemp)
{
iIemp = a[j]; /*重新设置最大值*/
iPos = j; /*记录元素的位置*/
}
}
/*交换数组的两个元素的值*/
/*让上面循环到的最大值,放第一个位置,原第一个元素放置到原最大元素的位置*/
a[iPos] = a[i];
a[i] = iIemp;
}
/*输出数组*/
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);
if(i == 4)
printf("\n");
}
return 0;
}
/*
冒泡法排序
从数组的最后面元素开始与相邻的元素进行比较,将最小(最大的元素)放到较大(较小)的前面,依此循环,直到数组排序完毕
*/
#include <stdio.h>
int main()
{
int i,j;
int a[10];
int iTemp;
printf("为数组元素赋值:\n");
/*通过键盘输入为数组元素赋值*/
for(i=0;i<10;i++)
{
printf("a[%d]",i);
scanf("%d",&a[i]);
}
/*从小到大排序*/
for(i=1;i<10;i++)
{
for(j=9;j>=i;j--)
{
if(a[j]<a[j-1])
{
/*交换两个数组元素的值*/
iTemp = a[j-1];
a[j-1] = a[j];
a[j] = iTemp;
}
}
}
/*输出数组*/
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);
if(i == 4)
printf("\n");
}
return 0;
}
/*
交换法排序
将每一位数与其后的所有数一一比较(将满足条件的互换位置,然后再重新拿第一个元素与后面的比较,依此类推),若发现符合条件的数据则交换位置
*/
#include<stdio.h>
int main()
{
int i,j;
int a[10];
int iTemp;
printf("为数组元素赋值:\n");
/*通过键盘输入为数组元素赋值*/
for(i=0;i<10;i++)
{
printf("a[%d]",i);
scanf("%d",&a[i]);
}
/*从到小排序*/
for(i=0;i<9;i++)
{
for(j=i+1;j<10;j++)
{
if(a[j] > a[i])
{
/*交换数组两个元素的位置*/
iTemp = a[i];
a[i] = a[j];
a[j] = iTemp; /*代替了上面if后面的a[j]*/
}
}
}
/*输出数组*/
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);
if(i == 4)
printf("\n");
}
return 0;
}
/*
插入法排序
在数组中取一个元素,放置到第一个位置,再冲原数组中取一个数,按一定的循序,如大小(和新数组中元素比较,放到一个合适的位置,依此类推
*/
#include<stdio.h>
int main()
{
int i;
int a[10];
int iTemp;
int iPos;
printf("为数组元素赋值:\n");
/*通过键盘输入为数组元素赋值*/
for(i=0;i<10;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
/*数组元素从小到大排序*/
for(i=1;i<10;i++)
{
iTemp = a[i];
iPos = i-1;
while((iPos>=0) && (iTemp<a[iPos]))
{
a[iPos+1] = a[iPos];
iPos --;
}
a[iPos+1] = iTemp;
}
/*输出数组*/
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);
if(i == 4)
printf("\n");
}
return 0;
}
/*
插入法排序
在数组中取一个元素,放置到第一个位置,再冲原数组中取一个数,按一定的循序,如大小(和新数组中元素比较,放到一个合适的位置,依此类推
*/
#include<stdio.h>
int main()
{
int i;
int a[10];
int iTemp;
int iPos;
printf("为数组元素赋值:\n");
/*通过键盘输入为数组元素赋值*/
for(i=0;i<10;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
/*数组元素从小到大排序*/
for(i=1;i<10;i++)
{
iTemp = a[i]; /*设置插入值*/
iPos = i-1;
while((iPos>=0) && (iTemp<a[iPos])) /*寻找插入的位置*/
{
a[iPos+1] = a[iPos]; /*插入到相应的位置(此处相当于新数组,在新数组中不断找到合适的位置为止再插入)*/
iPos --;
}
a[iPos+1] = iTemp;
}
/*输出数组*/
for(i=0;i<10;i++)
{
printf("%d\t",a[i]);
if(i == 4)
printf("\n");
}
return 0;
}
/*
折半法排序
在数组中选一个中间值,然后把中间值大的放一边,小的放另一边,然后再对两边分别递归使用这个过程
*/
#include<stdio.h>
/*声明函数*/
void CelerityRun(int left,int right,int array[]);
int main()
{
int i;
int a[8];
printf("为数组元素赋值::\n");
/*从键盘输入为数组元素赋值*/
for(i=0;i<8;i++)
{
printf("a[%d]=",a[i]);
scanf("%d",&a[i]);
}
/*从大到小排序*/
CelerityRun(0,7,a);
printf("8个元素从小到大的排序如下: \n");
/*输出数组*/
for(i=0;i<8;i++)
{
printf("%d\t",a[i]);
if(i == 4)
printf("\n");
}
printf("\n");
return ;
}
/*定义函数*/
void CelerityRun(int left,int right,int array[])
{
int i,j;
int middle,iTemp; /*定义变量*/
i = left;
j = right;
middle = array[(left+right)/2]; /*求中间值*/
do
{
while((array[i]<middle) && (i<right)) /*从左找小于中间值的数*/
i++;
while((array[j]>middle) && (j>left)) /*从右边找大于中间值的数*/
j--;
if(i<=j) /*找到了这对数值*/
{
iTemp = array[i]; /*交换这对数值*/
array[i] = array[j];
array[j] = iTemp;
i++;
j--;
}
}
while(i<=j); /*如果两边的下标交错,就停止(完成一次)*/
/*递归左半边*/
if(left<j)
CelerityRun(left,j,array);
/*递归右半边*/
if(right>i)
CelerityRun(i,right,array);
}