快速排序法(C语言)
#include
#include
#include
#include
#define randx(x) (rand()%x)
typedef int KeyType;
typedef int DataType;
typedef struct
{
KeyType key;/*排序码字段*/
DataType info; /*记录的其它字段*/
}RecordNode;
typedef struct
{
int n; /*文件中的记录个数,可以视为常量*/
RecordNode *record;
}SortObject;
void creatsort(SortObject * pvector, int &l, int &r)//新建二叉排序树{
int i; int k;
printf("您即将要创建一个序列\n");
printf("\n请输入该序列元素的个数\n");
scanf("%d", &pvector->n);
pvector->record = (RecordNode*)malloc((sizeof(RecordNode))*(pvector->n));
printf("\n你要以什么方式创建序列?\n方式1:自动创建请输入1,方式2:手动创建请输入0\n");
scanf("%d", &k);
if (k)
{
srand((int)time(0));
for (i = 0; i < pvector->n; i++)
{
if(pvector->n<100)
pvector->record[i].key = randx(100);
else if((pvector->n<1000))
pvector->record[i].key = randx(1000);
else
pvector->record[i].key = randx(pvector->n);
}
}
else
{
printf("\n请输入%d个大小不一样的整数\n", pvector->n);
for (i = 0; i < pvector->n; i++)
{
scanf("%d", &pvector->record[i].key);
}
}
if (pvector)
printf("\n序列创建成功!\n");
else
printf("\n序列创建失败!\n");
l = 0, r = pvector->n-1;
}
void show(SortObject * pvector)
{
printf("\n当前序列为:\n");
if (!pvector)
printf("当前序列为空");
else
for (int i = 1; i <= pvector->n; i++)
{
printf(" %d ", pvector->record[i-1].key);
if (i % 15 == 0)
printf("\n");
}
printf("\n");
}
void quickSort(SortObject* &pvector, int l, int r)
{
int i, j;
RecordNode temp, *data = pvector->record;
if (l >= r)
return; /* 只有一个记录或无记录,则无须排序*/
i = l;
j = r;
temp = data[i];
while (i != j)
{/* 找Rl的最终位置*/
while (i< j && data[j].key >= temp.key)
j--; /* 向左扫描找排序码小于temp.key的记录*/ if (i< j)
data[i++] = data[j];
while (i< j && data[i].key <= temp.key)
i++; /* 向右扫描找排序码大于temp.key的记录*/ if (i< j)
data[j--] = data[i];
}
data[i] = temp; /* 将Rl存入其最终位置*/
quickSort(pvector, l, i - 1); /* 递归处理左区间*/
quickSort(pvector, i + 1, r); /* 递归处理右区间*/
}
void interface(void)
{
printf("\n&&&&&&&&&&&&&&输入序号执行相应操作&&&&&&&&&&&&&&&&&\n");
printf(" 输入1,重新建立序列!\n");
printf("---------------------------------------------------\n");
printf(" 输入2,快速排序当前序列!\n");
printf("---------------------------------------------------\n");
printf(" 输入3,显示当前序列!\n");
printf("---------------------------------------------------\n");
printf(" 输入其他,退出操作!\n");
printf("---------------------------------------------------\n");
}
void operation(SortObject* pvector, int l, int r)
{
int k = 1, num;
while (k)
{
interface();//显示界面
scanf("%d", &num);
switch (num)
{
case 1:
free(pvector->record);//重新生成之前释放空间
free(pvector);//重新生成之前释放空间
creatsort(pvector, l, r);
break;
case 2:
{
quickSort(pvector, l, r);//执行快速排序
printf("\n已经为你执行快速排序!\n");
}
break;
case 3:
{
show(pvector);
}
break;
default:
printf("您未选定任何操作!请重新输入操作序号!\n");
k = 0;
break;
}
}
}
int main()
{
int l=0,r=0;
SortObject * pvector = (SortObject *)malloc(sizeof(SortObject));//分配序列指针creatsort(pvector, l, r);
operation(pvector, l, r);
getchar();
getchar();
return 0;
}
感谢下载!
欢迎您的下载,资料仅供参考
C语言几种常见的排序方法
C语言几种常见的排序方法 2009-04-2219:55 插入排序是这样实现的: 首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。 从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。 重复2号步骤,直至原数列为空。 插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现。它借助了"逐步扩大成果"的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度。 冒泡排序 冒泡排序是这样实现的: 首先将所有待排序的数字放入工作列表中。 从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。 重复2号步骤,直至再也不能交换。 冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但也是非常容易实现的算法。 选择排序 选择排序是这样实现的: 设数组内存放了n个待排数字,数组下标从1开始,到n结束。 i=1 从数组的第i个元素开始到第n个元素,寻找最小的元素。 将上一步找到的最小元素和第i位元素交换。 如果i=n-1算法结束,否则回到第3步 选择排序的平均时间复杂度也是O(n²)的。 快速排序 现在开始,我们要接触高效排序算法了。实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而"保证列表的前半部分都小于后半部分"就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。 堆排序 堆排序与前面的算法都不同,它是这样的: 首先新建一个空列表,作用与插入排序中的"有序列表"相同。 找到数列中最大的数字,将其加在"有序列表"的末尾,并将其从原数列中删除。 重复2号步骤,直至原数列为空。 堆排序的平均时间复杂度为nlogn,效率高(因为有堆这种数据结构以及它奇妙的特征,使得"找到数列中最大的数字"这样的操作只需要O(1)的时间复杂度,维护需要logn的时间复杂度),但是实现相对复杂(可以说是这里7种算法中比较难实现的)。
C语言9种常用排序法
C语言9种常用排序法 1.冒泡排序 2.选择排序 3.插入排序 4.快速排序 5.希尔排序 6.归并排序 7.堆排序 8.带哨兵的直接插入排序 9.基数排序 例子:乱序输入n个数,输出从小到大排序后的结果1.冒泡排序 #include for(i=0;i int i, j, n, a[100], t, temp; while(scanf("%d",&n)!=EOF) { for(i=0;i 一、设计思想 插入排序:首先,我们定义我们需要排序的数组,得到数组的长度。如果数组只有一个数字,那么我们直接认为它已经是排好序的,就不需要再进行调整,直接就得到了我们的结果。否则,我们从数组中的第二个元素开始遍历。然后,启动主索引,我们用curr当做我们遍历的主索引,每次主索引的开始,我们都使得要插入的位置(insertIndex)等于-1,即我们认为主索引之前的元素没有比主索引指向的元素值大的元素,那么自然主索引位置的元素不需要挪动位置。然后,开始副索引,副索引遍历所有主索引之前的排好的元素,当发现主索引之前的某个元素比主索引指向的元素的值大时,我们就将要插入的位置(insertIndex)记为第一个比主索引指向元素的位置,跳出副索引;否则,等待副索引自然完成。副索引遍历结束后,我们判断当前要插入的位置(insertIndex)是否等于-1,如果等于-1,说明主索引之前元素的值没有一个比主索引指向的元素的值大,那么主索引位置的元素不要挪动位置,回到主索引,主索引向后走一位,进行下一次主索引的遍历;否则,说明主索引之前insertIndex位置元素的值比主索引指向的元素的值大,那么,我们记录当前主索引指向的元素的值,然后将主索引之前从insertIndex位置开始的所有元素依次向后挪一位,这里注意,要从后向前一位一位挪,否则,会使得数组成为一串相同的数字。最后,将记录下的当前索引指向的元素的值放在要插入的位置(insertIndex)处,进行下一次主索引的遍历。继续上面的工作,最终我们就可以得到我们的排序结果。插入排序的特点在于,我们每次遍历,主索引之前的元素都是已经排好序的,我们找到比主索引指向元素的值大的第一个元素的位置,然后将主索引指向位置的元素插入到该位置,将该位置之后一直到主索引位置的元素依次向后挪动。这样的方法,使得挪动的次数相对较多,如果对于排序数据量较大,挪动成本较高的情况时,这种排序算法显然成本较高,时间复杂度相对较差,是初等通用排序算法中的一种。 选择排序:选择排序相对插入排序,是插入排序的一个优化,优化的前提是我们认为数据是比较大的,挪动数据的代价比数据比较的代价大很多,所以我们选择排序是追求少挪动,以比较次数换取挪动次数。首先,我们定义我们需要排序的数组,得到数组的长度,定义一个结果数组,用来存放排好序的数组,定义一个最小值,定义一个最小值的位置。然后,进入我们的遍历,每次进入遍历的时候我们都使得当前的最小值为9999,即认为每次最小值都是最大的数,用来进行和其他元素比较得到最小值,每次认为最小值的位置都是0,用来重新记录最小值的位置。然后,进入第二层循环,进行数值的比较,如果数组中的某个元素的值比最小值小,那么将当前的最小值设为元素的值,然后记录下来元素的位置,这样,当跳出循环体的时候,我们会得到要排序数组中的最小值,然后将最小值位置的数值设置为9999,即我们得到了最小值之后,就让数组中的这个数成为最大值,然后将结果数组result[]第主索引值位置上的元素赋值为最小值,进行下一次外层循环重复上面的工作。最终我们就得到了排好序的结果数组result[]。选择排序的优势在于,我们挪动元素的次数很少,只是每次对要排序的数组进行整体遍历,找到其中的最小的元素,然后将改元素的值放到一个新的结果数组中去,这样大大减少了挪动的次序,即我们要排序的数组有多少元素,我们就挪动多少次,而因为每次都要对数组的所有元素进行遍历,那么比较的次数就比较多,达到了n2次,所以,我们使用选择排序的前提是,认为挪动元素要比比较元素的成本高出很多的时候。他相对与插入排序,他的比较次数大于插入排序的次数,而挪动次数就很少,元素有多少个,挪动次数就是多少个。 希尔排序:首先,我们定义一个要排序的数组,然后定义一个步长的数组,该步长数组是由一组特定的数字组成的,步长数组具体得到过程我们不去考虑,是由科学家经过很长时间计算得到的,已经根据时间复杂度的要求,得到了最适合希尔排序的一组步长值以及计算几种排序算法的分析与比较--C语言
C语言的四种排序