{
datatype R[MAXNUM]
int d[6]=[50,25,12,6,3,2,1]
for(int i=0i<MAXNUMi++)
scanf("%d",&R[i].key)
ShellSort(R,MAXNUM,d,6)
for(int i=0i<MAXNUMi++)
printf("%d",R[i].key)
}
当待排序的序列已经有序(不管是升序还是降序),此时快速排序最慢,一般当数据量很大的时候,用快速排序比较好,为了避免原来的序列有序,一般采用改进的快速排序算法,在排序之前随机交换两个元素的位置,就可以达到目的了,有一本书,叫《算法设计、分析与实现:C、C++和java》徐子珊著。可以看看,里面写了很多基本的算法因为你的排序函数有问题,导致代码一直在排序函数中死循环,不能执行后边的输出。我改了下。
#include<stdio.h>#include<stdlib.h>
#define MaxLen 100
typedef struct{
int num
float score
}stu
typedef stu DataType
typedef struct{
DataType data[MaxLen+1]
int length
}SeqList
void CreatList(SeqList *L) {
int i, k, n
printf("请输入学生人数(小于等于%d):\n", MaxLen)
scanf("%d", &n)
i = 0//三次机会的话i从0开始,或者判断条件改为i<=3
while (n > MaxLen) {
if (i < 3)/*给三次输入机会*/ {
printf("储存空间不足,请重新输入学生人数:\n")
scanf("%d", &n)
i++
}
else {
printf("输入数据不正确,程序将退出!")
exit(1)
}
}
printf("请输入学生学号(int)和成绩(float):\n")
for (i = 0 i < n i++) {//使用数组时循环变量从0开始,或者数组下标从i-1开始,否则会导致L->data[0]空数据。
scanf("%d%f", &L->data[i].num, &L->data[i].score)
L->length = n
}
return
}
/*void SelectSort(SeqList *L) {
int i, j, k
for (i = 1 i<L->length i++) {
k = i
for (j = i + 1 j <= L->length i++)
if (L->data[j].score>L->data[k].score)
k = j
if (i != k) {
L->data[0] = L->data[k]
L->data[k] = L->data[i]
L->data[i] = L->data[0]
}
}
}*/
void SelectSort(SeqList *L) {
int i, j
DataType temp
for (i = 0 i < L->length-1 i++) {
for (j = 0 j < L->length - 1-i j++) {
if (L->data[j].score<L->data[j+1].score) {
temp= L->data[j]
L->data[j] = L->data[j+1]
L->data[j+1] = temp
}
}
}
return
}
void PrintList(SeqList *L){
int i
printf("学生学号和成绩分别为\n")
for (i = 0 i < L->length i++) {//从0开始录入,所以从0开始输出
printf("%d %5.2f\n", L->data[i].num, L->data[i].score)
}
return
}
int main(){
int i
SeqList *L
L=(SeqList*)malloc(sizeof(SeqList))
CreatList(L)
SelectSort(L)
PrintList(L)
system("pause")
return 0
}