用JAVA实现折半插入排序的题目

用JAVA实现折半插入排序的题目,第1张

别忘记给分哦

package comadtechinterftest;

public class Test{

public Test(Record a[]) {

int i, j, m, low, high;

Record temp;

for (i = 0; i < alength; i++) {

temp = a[i];

low = 0;

high = i;

while (low <= high) {

m = (low + high) / 2;

if (tempgetStudentID() < a[m]getStudentID()) {

high = m - 1;

} else {

low = m + 1;

}

}

for (j = i; j > high + 1 && j > 0; j--) { // 如果j>high 就会少遍历一个元素 || j>low

a[j] = a[j - 1];

}

a[j] = temp;

}

for (int t = 0; t < alength; t++) {

Systemoutprintln(a[t]getStudentID());

}

}

public static void main(String args[]) {

Record record1 = new Record(2,"张三1",810,18);

Record record2 = new Record(4,"张三2",820,11);

Record record3 = new Record(5,"张三3",830,12);

Record record4 = new Record(43,"张三4",840,13);

Record record5 = new Record(21,"张三5",850,14);

Record record6 = new Record(54,"张三6",860,15);

Record record7 = new Record(22,"张三7",870,16);

Record record8 = new Record(6,"张三4",880,17);

Record record9 = new Record(223,"张三9",890,18);

Record record10 = new Record(545,"张三10",800,19);

Record [] record = new Record[]{record1,record2,record3,record4,

record5,record6,record7,record8,record9,record10};

new Test(record);

}

}

//参考代码如下:

#include <stdioh>

int main()

{

int i, j, n, k=0, isFound=0;

int num[15] = {88,86,75,74,61,56,52,43,39,34,31,22,18,16,8}; //测试数组

printf("请输出一个整数:\n");

scanf("%d", &n);

i = (int)15/2; //对折位移量

j = (int)15/2; //取数“指针”

while(k<2)

{

i = (int)i/2;

if(i == 0) k++; //i==0 即折半到无可再折时,仍有最后一次比较,故以k做计数

//若未相等,计算下一循环指针的位置

if(n<num[j])

j = j + (i + 1);

else if(n>num[j])

j = j - (i + 1);

else

{

isFound = 1;

break; //若找到相等数,标记已找到并退出循环

}

}

//输出结果

if(isFound)

printf("该数是数组中第%d个元素的值\n", j);

else

printf("查无此数!\n");

return 0;

}

折半插入排序是对直接插入排序的一种改良方式,在直接插入排序中,每次向已排序序列中插入元素时,都要去寻找插入元素的合适位置,但是这个过程是从已排序序列的最后开始逐一去比较大小的,这其实很是浪费,因为每比较一次紧接着就是元素的移动。

折半排序就是通过折半的方式去找到合适的位置,然后一次性进行移动,为插入的元素腾出位置。

折半查找,因为再已排序的序列中,序列元素都是按照顺序排列的,既然这样,完全不需要逐一去比较大小,而是去比较已排序序列的中位数,这个中间的位置将一排序列分为左右两部分,通过一次比较后,就缩小了比较的范围,重复这样的 *** 作,需要插入的元素就找到了合适的位置了。

//------------插入排序---void InsertSort(SqList &L){//对顺序表L作直接插入排序。 int i,j; for(i=2;i<=Llength;++i) if(LT(Lr[i]key,Lr[i-1]key))//“<”,需将Lr[i]插入有序子表 { Lr[0]=Lr[i];//复制为哨兵 Lr[i]=Lr[i-1]; for(j=i-2;LT(Lr[0]key,Lr[j]key);--j) Lr[j+1]=Lr[j];//记录后移 Lr[j+1]=Lr[0];//插入到正确位置 }}//--------------冒泡排序---void BubbleSort(SqList &L){//Lr是待排序的文件,采用自下向上扫描,对Lr做冒泡排序 int i,j; int exchange; // 交换标志 for(i=1;i<Llength;i++) {// 最多做 n-1 趟排序 exchange=FALSE; // 本趟排序开始前,交换标志应为假 for(j=Llength-1;j>=i;j--) // 对当前无序区 R[in] 自下向上扫描 if(LT(Lr[j+1]key,Lr[j]key)) { // 交换记录 Lr[0]=Lr[j+1]; //Lr[0]不是哨兵,仅做暂存单元 Lr[j+1]=Lr[j]; Lr[j]=Lr[0]; exchange=TRUE; // 发生了交换,故将交换标志置为真 } if(!exchange) // 本趟排序未发生交换,提前终止算法 return; } }//-----------快速排序---int Partition(SqList &L,int low,int high){//交换顺序表L中子表r[lowhigh]的记录,枢轴记录到位,并返回其所在位置,此时 //在它之前(后)的记录均不大(小)于它。 KeyType pivotkey; Lr[0]=Lr[low];//用子表的第一个记录作枢轴记录 pivotkey=Lr[low]key;//枢轴记录关键字 while(low<high) {//从表的两端交替地向中间扫描 while (low<high&&Lr[high]key>=pivotkey) --high; Lr[low]=Lr[high];//将比枢轴记录小的记录移到低端 while (low<high&&Lr[low]key<=pivotkey) ++low; Lr[high]=Lr[low];//将比枢轴记录大的记录移到高端 } Lr[low]=Lr[0];//枢轴记录到位 return low;//返回枢轴位置} void QSort(SqList &L,int low,int high){//对顺序表L中的子序列Lr[lowhigh]进行快速排序 int pivotloc; if(low<high) {//长度大于1 pivotloc=Partition(L,low,high);//将Lr[lowhigh]一分为二 QSort(L,low,pivotloc-1);//对低子表递归排序pivotloc是枢轴位置 QSort(L,pivotloc+1,high);//对高子表递归排序 }} void QuickSort(SqList &L){//对顺序表L作快速排序。 QSort(L,1,Llength);}//----------归并排序---void Merge(RedType SR[],RedType TR[],int i,int m,int n){//将有序的SR[im]和SR[m+1n]归并为有序的TR[in] int j,k; for(j=m+1,k=i;i<=m&&j<=n;++k) {//将SR中记录由小到大地并入TR if LQ(SR[i]key,SR[j]key) TR[k]=SR[i++]; else TR[k]=SR[j++]; } if(i<=m)//TR[kn]=SR[im];将剩余的SR[im]复制到TR while(k<=n&&i<=m) TR[k++]=SR[i++]; if(j<=n)//将剩余的SR[jn]复制到TR while(k<=n&&j<=n) TR[k++]=SR[j++];} void MSort(RedType SR[],RedType TR1[],int s,int t){//将SR[st]归并排序为TR1[st]。 int m; RedType TR2[20]; if(s==t) TR1[t] = SR[s]; else { m=(s+t)/2;//将SR[st]平分为SR[sm]和SR[m+1t] MSort(SR,TR2,s,m);//递归地将SR[sm]归并为有序的TR2[sm] MSort(SR,TR2,m+1,t);//将SR[m+1t]归并为有序的TR2[m+1t] Merge(TR2,TR1,s,m,t);//将TR2[sm]和TR2[m+1t]归并到TR1[st] }} void MergeSort(SqList &L){// 对顺序表L作归并排序。 MSort(Lr, Lr, 1, Llength);}//-----------堆排序---void HeapAdjust(SqList &H,int s,int m){//已知Hr[sm]中记录的关键字除Hr[s]key之外均满足堆的定义, //本函数调整Hr[s]的关键字,使Hr[sm]成为一个大顶堆 //(对其中记录的关键字而言) int j; RedType rc; rc=Hr[s]; for(j=2s;j<=m;j=2) {//沿key较大的孩子结点向下筛选 if(j<m&&Hr[j]key<Hr[j+1]key) ++j;//j为key较大的记录的下标 if(rckey>=Hr[j]key) break;//rc应插入在位置s上 Hr[s]=Hr[j]; s=j; } Hr[s]=rc;//插入} void HeapSort(SqList &H){//对顺序表H进行堆排序。 int i; RedType temp; for(i=Hlength/2;i>0;--i)//把Hr[1Hlength]建成大顶堆 HeapAdjust(H,i,Hlength); for(i=Hlength;i>1;--i) { temp=Hr[i]; Hr[i]=Hr[1]; Hr[1]=temp;//将堆顶记录和当前未经排序子序列Hr[1i]中 //最后一个记录相互交换 HeapAdjust(H,1,i-1);//将Hr[1i-1]重新调整为大顶堆 }} void main(){ SqList S; printf("---------- 五种排序算法 ----------\n"); InitList_Sq(S); printf(" 1简单插入排序\n"); InsertSort(S); Print_Sq(S); printf(" 2冒泡排序\n"); BubbleSort(S); Print_Sq(S); printf(" 3快速排序\n"); QuickSort(S); Print_Sq(S); printf(" 4归并排序\n"); MergeSort(S); Print_Sq(S); printf(" 5堆排序\n"); HeapSort(S); Print_Sq(S);}

#include <stdioh>

int main()

{

int a[10],i,j,tem;

for(i=0;i<=9;i++)

{

printf("请输入第%d个数:",i+1);

scanf("%d",&a[i]);

}

for(i=0;i<=8;i++)

for(j=0;j<=1-i;j++)

if(a[j]>a[j+1])

{

tem=a[i];

a[i]=a[i+1];

a[i+1]=tem;

}

for(i=0;i<=9;i++)

printf("%d ",a[i]);

return 0;

}

排序:

#include<stdioh>

#define N 10

void Display(int a, int n)

{

int i;

for (i = 0; i < n; i++) {

printf("%d ", a[i]);

}

printf("\n");

}

void SelectionSort(int a, int n)

{

int i, j, index, value;

for (i = 0; i < n - 1; i ++) {

index = i;

value = a[i];

for (j = i + 1; j < n; j ++)

if (value > a[j]) {

index = j;

value = a[j];

}

a[index] = a[i];

a[i] = value;

Display(a, n);

}

}

void main()

{

int a[N],i ;

for(i=0;i<N;i++)

a[i]=N-i;

Display(a, N);

SelectionSort(a, N);

}

折半查找:

int binarysearch(int number)

{

int mid, start = 0, end = LEN - 1;

/ 假定a是排好序的 /

/ mustbe(start, end, number),因为a[startend]就是整个数组a[0LEN-1] /

while (start <= end) {

/ mustbe(start, end, number),因为一开始进入循环时是正确的,每次循环也都维护了这个条件 /

mid = (start + end) / 2;//取a数组中间的值,与number比较

if (a[mid] < number)

/ 如果a数组中间值小于number,那么number一定要在mid后的后半段数组中,所以我们就将mid+1,将这个作为start,number必然在后半段数组a[mid+1,end]中/

start = mid + 1;

else if (a[mid] > number)

/如果a数组中间值大于number,那么number一定在mid前的前半段数组中,那么应该将mid-1,这个mid-1就是前半段数组的最后一个元素 /

end = mid - 1;

else

/ a[mid] == number,说明找到了 /

return mid;

}

/

mustbe(start, end, number)一直被循环维护着,到这里应该仍然成立,在a[startend]范围之外一定不存在number,

但现在a[startend]是空序列,在这个范围之外的正是整个数组a,因此整个数组a中都不存在number

/

return -1;

}

// hgjkgcpp : 定义控制台应用程序的入口点。

//

#include "stdafxh"

#define n 11

int count=0;

int bin_search(int a[],int low,int high,int x) //折半查找函数

{ count++;

int mid;

if(low>high) return -1;

else

{

mid=(low+high)/2;

if(x==a[mid]) return mid;

else if(x<a[mid])

return bin_search(a,low,mid-1,x);

else

return bin_search(a,mid+1,high,x);

}

}

int _tmain(int argc, _TCHAR argv[])

{

int s;

int a[n]={3,5,8,10,15,22,28,30,31,55};

s=bin_search(a,0,9,28);

if(s==-1){

printf("没有找到要查询的数\n");

printf("本次查询总用了 %d 次\n",count);

}

else

{

printf("本次查询总用了 %d 次\n",count);

printf("本次查找到的下标是: %d \n",s);

}

return 0;

}

这程序我已经运行成功了,我是在VS2005环境下运行的

以上就是关于用JAVA实现折半插入排序的题目全部的内容,包括:用JAVA实现折半插入排序的题目、c语言编程实现“折半查找”的过程。、折半插入排序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10108189.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存