c语言排序和查找?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言排序和查找?相关的知识,希望对你有一定的参考价值。

(1)建立100个以上元素的线性表;
(2)分别利用选择类排序、插入类排序、交换类排序、归并排序等各种排序方法对他们进行排序,并输出各自的比较和移动次数。
(3)分别在排序前的表中实现顺序查找,在排序后的表中实现二分查找,统计各自的比较次数。

这道题目毫无头绪 有没有大佬发下代码呀,最后附上备注说明,小弟万分感谢!!!

1)利用readData()函数从data1.txt中读入不同规模的数据存入数组,
编写基于数组的顺序查找算法,测试数据量为1万、5万、10万、20万、
30万、40万和50万时的数据查询时间。
算法代码如下:

1 int seqsearch(int a[],int n,int key)
2
3 int k=n-1;
4 while(k>=0&&a[k]!=key)
5 k--;
6 return (k);
7

2)利用readData()函数从data2.txt中读入不同规模的有序数据存入数组,
编写基于数组的二分查找算法,测试数据量为1万、5万、10万、20万、30万、
40万和50万时的数据查询时间。
算法代码如下:

1 int binSearch(int a[],int n,int key)
2
3 int low=0;
4 int high=n-1;
5 int mid;
6 while(low<=high)
7
8 mid=(low+high)/2;
9 if(a[mid]==key) return mid;
10 if(a[mid]>key)
11 high=mid-1;
12 else
13 low=mid+1;
14
15 return -1;
16

3)请设计冒泡排序算法函数void bubbleSort(int a[],int n),对a[1]..a[n]进行升序排序。
并测试在不同数据规模下的排序效率。
算法代码如下:


1 void bubbleSort(int a[],int n)
2
3 int i=1,j,flag=1;
4 while(i<=n-1&&flag)
5
6 flag=0;
7 for(j=1;j<=n-1-i;j++)
8 if(a[j+1]<a[j])
9
10 a[0]=a[j];
11 a[j]=a[j+1];
12 a[j+1]=a[0];
13 flag=1;
14
15 i++;
16
17
追问

是这样?我怎么感觉不对啊?

参考技术A 不是“这道题目”,这明明是几道题目。但它已经把要求都写好了,不是很懂你为什么会毫无头绪?不会线性表就去学线性表,不会选择类排序就去学选择类排序。哪里有问题?追问

我就是想拿个答案,用得着那么直接说?你到底会不会啊?不会别浪费那么多时间啊,打那么多字你不累啊?

追答

?你不是在说毫无头绪吗?我还以为你是想要头绪呢?没想到你是伸手党?
打那么多字当然不累,因为实现题目要求的代码有上百行,我这才几个字,少多了。

追问

你好闲啊

参考技术B -c语言排序与查找排序与查找 1选择排序 算法:N元数组a[0]~a[N-1]由小到大排序: 第0步:找到a[0]~a[N-1]中的最小值元素与最大值 参考技术C /*
1.插入排序
2.选择排序
3.冒泡排序
4.希尔排序
5.快速排序
6.归并排序
7.堆排序
*/

/*
1.插入排序
思路:R[0],R[1],...R[i]是已经排序好的序列,要把R[i+1]插入到合适的位置。
template
*/
void insertionSort(vector &a)

int j;
T temp;
for(int i=1;i<a.size();i++)

temp=a[i];
j=i-1;
while(temp<a[j])

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

a[j+1]=temp;




/*

2.选择排序:
依次遍历,在合适的位置选择合适的数。每次选择最小的那一个。
*/
template
void selectionSort(vector &a)

int num=a.size();
T temp;
int p;
for(int i=0;i<num;i++)

temp=a[i];
p=i;
for(int j=i+1;j<num;j++)

if(a[j] < a[i]) p=j;


if(p != i)

temp=a[p];
a[i]=a[p];
a[p]=temp;





/*
3.冒泡排序
思路:从上到下,挨个比较相邻的两个数,较大的放在下面,知道任何两个数都是小在上,大在下。
*/
template
void bubbleSort(vector &a)

int num=a.size();
T temp;
bool flag=false;
for(int i=0;i<num-1;i++)

flag=false;
for(int j=0;j<num-i;j++)

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

flag=true;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;



if(flag==false) break;



/*
4.希尔排序
思路:不是再每次比较相邻的两个数,而是比较间隔固定距离的两个数,这样一次可以减少。
*/
template
void shellSort(vector &a, int *incre, int ni) //增量存在数组incre里面,ni是数组incre的长度

int j;
T temp;
for(int g=0;gi<ni;g++)

for(int i=incre[g];i<a.size();i++)

temp=a[i];
j=i-incre[g];
while(temp<a[j])

a[j+incre[g]]=a[j];
j--;

a[j+incre[g]]=temp;




template
void shellSort2(vector &a)


int num=a.size();
int i,j,j;
T temp;
( (n/2)%2 ==0)? k=n/2+1 : k=n/2;//保证k为奇数
while(k>0)

for(i=k;i<num;i++)

temp=a[i];
j=i-k;
while( temp < a[j])

a[j+k]=a[j];
j-=k;

a[j+k]=temp;

(k/2)%2==0 ? k=k/2+1 : k=k/2;



/*
5.快速排序
思路:选定一个值(可随机,可为a[0],随机更好),将小于这个数的所有数放在它的左边,大于这个数的放在又变。
*/
template
void quickSort(vector &a, int l, int r)

if(l<r)

int q=partition(a,l,r);
quickSort(a,l,q-1);
quickSort(q,q+1,r);



template
void partition(vector &a, int l, int r)

T temp=a[l],t;
int i=l,j=r;
while(i<=j)

while( a[++i]<temp && i<r);
while( a[j--]>temp);
t=a[i];
a[i]=a[j];
a[j]=t;

a[l]=a[j];
a[j]=x;
return j;


/*
6.归并排序
思路:将数组分段,分治思想,然后再合并
*/
template
void mergeSort(vector &a)

vector tmpArray(a.size());
mergeSort(a, tmpArray, 0, a.size()-1);


template
void mergeSort(vector &a, vector &tmpArray,int l, int r)

if(l<r)

int center=(l+r)/2;
mergeSort(a, tmpArray, l, center);
mergeSort(a, tmpArray, center+1, r);
merge(a,tmpArray,l,center+1,r);


template
void merge(vector &a, vector &tmpArray,int l, int center, int r)

int i=l,j=center;
int k=l;
while(i<center && j<=r)

if(a[i] < a[j] )
tmpArray[k++]=a[i++];
else
tmpArray[k++]=a[j++];


while(i < center) tmpArray[k++]=a[i++];
while(j <= r) tmpArray[k++]=a[j++];

for(i=l;i<=r;i++)

a[i]=tmpArray[i];



/*
7.堆排序
思路:建立堆,堆顶为最大。交换堆顶与堆底。调节二叉树,使堆顶元素始终为最大元素
*/
template
void heapSort(vector &a)

for (int i=a.size()/2;i>=0;--i)//build heap

perdown(a, i, a.size());


T temp;
for(int j=a.size()-1;j>=0;--j)

temp=a[j];
a[j]=a[0];
a[0]=temp;

perdown(a, 0 ,j);




template
void perdown(vector&a, int i, int n)

int child;
T temp;
for(temp=a[i]; 2*i+1<n;i=child)

child=2*i+1;
if(child+1<n && a[child]<a[child+1]) ++child;
if(temp <a[child]) a[i]=a[child];
else break;

a[i]=temp;


int main()

vector vi(5);
vi[0]=3;
vi[1]=2;
vi[2]=1;
vi[3]=5;
vi[4]=4;
cout<<"heapSort"<<endl;
heapSort(vi);
for (int i=0;i<vi.size();i++)

cout<<vi[i]<<" ";

cout<<endl;
cout<<"mergeSort"<<endl;
mergeSort(vi);
for (int i=0;i<vi.size();i++)

cout<<vi[i]<<" ";

cout<<endl;
getchar();
return 1;

C语言之实现函数返回一个数组,以及选择排序,还有折半查找。这是同学的一个作业。。。

作业的具体要求如下:

编写一个完整的程序,实现如下功能。
(1)    输入10个无序的整数。
(2)    用选择排序法将以上接收的10个无序整数按从大到小的顺序排序。
(3)    要求任意输入一个整数,用折半查找法从排好序的10个数中找出该数,若存在,在主函数中输出其所处的位置,否则,提示未找到。
提示:可定义input函数完成10个整数的输入,sort函数完成输入数的排序,search函数
完成输入数的査找功能。

下面是具体代码:(本人懒,没写注释,不过仔细看代码,还是很简单的)

 1 #include <stdio.h>
 2 #define N 10
 3 
 4 //    13  34 3 15 26 18 19 14 30 24
 5 
 6 int *input();
 7 int *sort(int m[]);
 8 void search(int m[],int c);
 9 main()
10 {
11     int *a;
12     int i,k;
13     int m[N];
14     a=input();
15     for(i=0;i<N;i++)
16     {
17         m[i]=*a;
18         a++;
19     }
20     a=sort(m);
21     printf("\n排序结果:\n");
22     for(i=0;i<N;i++)
23     {
24         m[i]=*a;
25         a++;
26         printf("%d\n",m[i]);
27     }
28 
29     for(i=0;i<100;i++)
30     {    printf("请输入您想查找的数:");
31     scanf("%d",&k);
32         search(m,k);
33     }
34 
35 }
36 void search(int m[],int c)
37 {
38     int h,l,i;
39     for(h=0,l=N;h<=l;)
40     {
41         i=(h+l)/2;
42         if(c==m[i])
43         {
44             printf("是第%d个元素\n",i+1);break;
45         }
46         else if(c>m[i])
47         l=i-1;
48         else if(c<m[i])
49         h=i+1;
50     }
51     if(h>l)
52       printf("无此元素");
53     return 0;
54 }
55 int *sort(int m[])
56 {
57     int i,j;
58     int index,temp;
59     for ( i = 0; i < N - 1; i++)
60     {
61         temp = 0;
62         index = i;
63         for ( j = i + 1; j < N; j++)
64         {
65             if (m[index] < m[j])
66             {
67                 index = j;
68             }
69         }
70         temp = m[index];
71         m[index] = m[i];
72         m[i] = temp;
73     }
74     return m;
75 }
76 int *input()
77 {
78     printf("请输入10个整数:\n");
79     static int m[N];
80     int i;
81     for(i=0;i<N;i++)
82     {
83         scanf("%d",&m[i]);
84     }
85     return m;
86 }

 

以上是关于c语言排序和查找?的主要内容,如果未能解决你的问题,请参考以下文章

计算机二级C语言公共基础知识,以及习题总结查找和排序

C语言冒泡排序法代码

大话数据结构C语言56 二叉排序树的查找插入和删除

C语言_数组的查找替换排序拼接

C语言经典编程题(上)

C语言数据结构与算法------排序全面总结