**
学生成绩档案管理系统预习
**
问题描述:
实验任务:
学生信息录入,信息包括学号、姓名、专业、四门课成绩、总分、名次;
系统可对学生信息浏览、增加、删除和修改;
按学生成绩确定名次及信息输出,双向冒泡排序、希尔排序、快速排序、堆排序。
要求可对学生信息查询,根据学号或姓名进行查找;
信息修改仅可修改四门课成绩;
文件存取学生信息。
问题解决:
Student类:
学号、姓名、专业、语文、数学、英语、化学四门课的成绩、总分、名次
System:
信息浏览功能、增加、删除和修改功能
Function类:
确定名次及信息输出(使用:双向冒泡排序、希尔排序、快速排序、堆排序)
可对学生信息查询,根据学号或姓名进行查找;
信息修改仅可修改四门课成绩;
文件存取学生信息。(建立SutdentDatabase?)
问题难点:
双向冒泡排序、希尔排序、快速排序、堆排序
**
双向冒泡排序:
**
双向冒泡排序是在冒泡排序的基础上改进而来的,其基本思想跟最原始的冒泡排序是一样的,只不过排序过程稍微优化了一点。
我们还是以整数升序排序为例来简单说说这种排序的过程:首先从前往后把最大数移到最后,然后反过来从后往前把最小的一个数移动到数组最前面,这一过程就是第一轮,然后重复这一过程,最终就会把整个数组从小到大排列好。双向冒泡排序要稍微优于传统的冒泡排序,因为双向排序时数组的两头都排序好了,我们只需要处理数组的中间部分即可,而单向即传统的冒泡排序只有尾部的元素是排好序的,这时每轮处理都需要从头一直处理到已经排好序元素的前面一个元素。虽然它在效率上有了点改进,但它也不能大幅度提高其排序的效率,这是由冒泡排序的基本过程所决定了的。
void BidBubbleSort(int array[], int n)
{
int low, high, flag, i;
low = 0;
high = n - 1;
while(low < high)
{
flag=0;
for(i=low; i<high; i++) //正向冒泡
{
if(array[i] > array[i+1]) //找到剩下中最大的
{
Swap(&array[i], &array[i+1]);
flag = 1; //标志, 有数据交换
}
}
if( !flag )
break;
high--;
for( i=high; i>low; i-- ) //反向冒泡
{
if(array[i] < array[i-1]) //找到剩下中最小的
Swap(&array[i], &array[i-1]);
}
low++;
}
}
**
希尔排序:
**
希尔排序称为改进的插入排序,首先取一个间隔,将间隔的数进行首次排序,间隔大时移动次数少,间隔小时移动的间距小,所以计算速度快,再将间隔缩小进行排序,这时候基本接近顺序排列了,最后普通插入排序即可。
//希尔排序法
public class ShellSort {
public static void main(String[] args) {
int[] arr= {6,5,8,3,9,7,2,4};
sort(arr);
print(arr);
}
//间隔序列Knuth序列h=1 h=3h+1;
public static void sort(int[] arr) {
int h=1;
while(h<=arr.length/3) {
h=h*3+1;
}//找出最大的步长
// int gap=arr.length/2;
for(int gap=h;gap>0;gap=(gap-1)/3) {
for(int i=gap;i<arr.length;i++) {
for(int j=i;j>gap-1;j-=gap) {
if(arr[j]<arr[j-gap])
swap(arr,j,j-gap);
}
}
}
}
static void swap(int[] arr,int i,int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
static void print(int[] arr) {
for(int i1=0;i1<arr.length;i1++) {
System.out.print(arr[i1]+" ");
}
}
}
**
快速排序
**
快速排序
**
堆排序
**
堆排序
如有雷同,必是借鉴。