void sort(int l,int r, int pos) //对课程的成绩进行排序 { if (r <= l) return; int i = l, j = r; int key = students[l].scores[pos]; while (i <= j) { while (students[i].scores[pos] > key) i++; while (students[j].scores[pos] < key) j--; if (i <= j) { Student temp = students[i]; students[i] = students[j]; students[j] = temp; i++; j--; } } sort(l, j, pos); sort(i, r, pos); }
时间: 2024-04-02 12:33:44 浏览: 23
这段代码是一个快速排序算法的实现,用于对一个学生数组中的某个成绩进行排序。其中,参数l和r表示要排序的区间范围,pos表示要排序的成绩在学生结构体中的位置。具体实现中,首先以区间的第一个元素为基准,将整个区间分为两部分,左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素。然后递归地对左右两部分进行排序,直到区间范围缩小为1或0时停止递归。
相关问题
#include<stdio.h> #include<stdlib.h> int Binary_search(int *s,int length,int key);//二分查找函数 void sort(int *s,int length);//对数组进行排序函数 int main() { int m; int i; int key; int n[100];//待排序数组 scanf("%d",&m); for(i=0;i<m;i++) scanf("%d",&n[i]); sort(n,m); printf("数据递增排序的结果:\n"); for(i=0;i<m;i++) printf("%d ",n[i]); printf("\n"); scanf("%d",&key); int pos=Binary_search(n,m,key); if(pos==-1) printf("没有找到需要查询的数据:\n"); else printf("数据%d的索引位置 %d\n",key,pos); return 0; } void sort(int *s,int length)//对数组进行排序函数 { //改进版的冒泡排序算法 递增排序 int i=length-1;//比较的次数 int j; int t; int flag=1; while(flag) { flag=0; for(j=0;j<i;j++) { if(s[j]>s[j+1]) { t=s[j]; ; s[j+1]=t;//交换数据 flag=1; } } i--; } } int Binary_search(int *s,int length,int key)//二分查找函数 { int L,H,M; L=0; H=length-1; while(L<=H) { ; if(s[M]==key) return M; if(key<s[M]) H= ; else L=M+1; } return -1; }请将下面二分查找程序补充完整。
下面是完整的二分查找程序:
```c
int Binary_search(int *s, int length, int key)
{
int L, H, M;
L = 0;
H = length - 1;
while (L <= H) {
M = (L + H) / 2;
if (s[M] == key)
return M;
if (key < s[M])
H = M - 1;
else
L = M + 1;
}
return -1;
}
```
二分查找的思路是:首先将待查找的区间的左端点L设为0,将右端点H设为n-1(n为数组长度),然后计算中间位置M。如果要查找的值等于s[M],则查找成功,返回M;否则,如果要查找的值小于s[M],则在左半区间继续查找;如果要查找的值大于s[M],则在右半区间继续查找。每次查找都将待查找区间缩小一半,直到找到要查找的值或者区间缩小到只有一个元素为止。如果最终没有找到要查找的值,则返回-1表示查找失败。
完善代码1.冒泡排序 2.快速排序 3.堆排序#include <iostream> #include<cstdlib> #include<Windows.h> #include<ctime> using namespace std; void randomAssign(int a[],int n){ srand(time(0)); for(int i = 0; i < n;i++) a[i] = rand()%n+1; } void print(const char* str,int a[],int n){ cout<<str<<"="; for(int i = 0; i < n; i++) cout<<a[i] <<" "; cout<<endl; } void bubbleSort(int a[],int n){ for(int i = n; i >= 1; i--) for(int j = 1; j < i; j++) if(a[j+1] > a[j]) swap(a[j+1],a[j]); } int onePartition(int a[],int left,int right){ int pivot = a[left]; int i = left; int j = right; while(i < j){ while(XXXXXXXXXXXXX;) j++; if( i < j) a[i] = a[j]; XXXXXXXXXXXXX; XXXXXXXXXXXXX; if( i < j) a[j] = a[i]; } XXXXXXXXXXXXX; return i; } void quickSort(int a[],int left,int right){ if(left >= right) return ; int pos = XXXXXXXXXXXXX;; XXXXXXXXXXXXX; quickSort(a,pos+1,right); } void quickSort(int a[],int n){ quickSort(a,0,n-1); } void sift(int a[],int pos,int n){ //n表示长度 int parent = pos; int son = parent * 2 + 1; int tmp = a[parent]; while (son <= n - 1){ // 有效下标 0...n-1 if (son + 1 <= n - 1 && a[son] < a[son + 1]) son++; if(XXXXXXXXXXXXX) return; else { XXXXXXXXXXXXX; parent = son; son = parent * 2 + 1; } } } void heapSort(int a[],int n) { int i = 0; for (i = n / 2 - 1; i >= 0; i--) //从最后一个非叶结点开始 sift(a,i,n); for (i = n-1; i> 0; i--) { swap(a[0],a[i]); XXXXXXXXXXXXX; } } typedef void(*SortFunc)(int[], int); void testSort(SortFunc sortFunc,int n = 10){ DWORD start, end; int* a = new int[n]; randomAssign(a,n); if(n < 20) print("排序前",a,n); start = GetTickCount(); sortFunc(a,n); end = GetTickCount(); if(n < 20) print("排序后",a,n); cout<<"花费时间="<<end - start<<"毫秒"<<endl<<endl; delete [] a; } int main(){ testSort(bubbleSort,10); testSort(quickSort,10); testSort(heapSort,10); return 1; }
冒泡排序、快速排序和堆排序的代码已经提供,下面是完整的代码:
```c++
#include <iostream>
#include <cstdlib>
#include <Windows.h>
#include <ctime>
using namespace std;
void randomAssign(int a[], int n) {
srand(time(0));
for (int i = 0; i < n; i++)
a[i] = rand() % n + 1;
}
void print(const char* str, int a[], int n) {
cout << str << "=";
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
void bubbleSort(int a[], int n) {
for (int i = n; i >= 1; i--)
for (int j = 1; j < i; j++)
if (a[j + 1] > a[j])
swap(a[j + 1], a[j]);
}
int onePartition(int a[], int left, int right) {
int pivot = a[left];
int i = left;
int j = right;
while (i < j) {
while (a[j] >= pivot && i < j)
j--;
if (i < j)
a[i++] = a[j];
while (a[i] <= pivot && i < j)
i++;
if (i < j)
a[j--] = a[i];
}
a[i] = pivot;
return i;
}
void quickSort(int a[], int left, int right) {
if (left >= right)
return;
int pos = onePartition(a, left, right);
quickSort(a, left, pos - 1);
quickSort(a, pos + 1, right);
}
void quickSort(int a[], int n) {
quickSort(a, 0, n - 1);
}
void sift(int a[], int pos, int n) { // n表示长度
int parent = pos;
int son = parent * 2 + 1;
int tmp = a[parent];
while (son <= n - 1) { // 有效下标 0...n-1
if (son + 1 <= n - 1 && a[son] < a[son + 1])
son++;
if (tmp >= a[son])
break;
else {
a[parent] = a[son];
parent = son;
son = parent * 2 + 1;
}
}
a[parent] = tmp;
}
void heapSort(int a[], int n) {
int i = 0;
for (i = n / 2 - 1; i >= 0; i--) //从最后一个非叶结点开始
sift(a, i, n);
for (i = n - 1; i > 0; i--) {
swap(a[0], a[i]);
sift(a, 0, i);
}
}
typedef void(*SortFunc)(int[], int);
void testSort(SortFunc sortFunc, int n = 10) {
DWORD start, end;
int* a = new int[n];
randomAssign(a, n);
if (n < 20)
print("排序前", a, n);
start = GetTickCount();
sortFunc(a, n);
end = GetTickCount();
if (n < 20)
print("排序后", a, n);
cout << "花费时间=" << end - start << "毫秒" << endl << endl;
delete[] a;
}
int main() {
testSort(bubbleSort, 10);
testSort(quickSort, 10);
testSort(heapSort, 10);
return 1;
}
```
需要注意的是:
1. 在快速排序的 onePartition 函数中,i 和 j 的初始值应该分别为 left 和 right,而不是 left + 1 和 right - 1。这是因为在 while 循环中,i 和 j 分别向中间移动,不会越界。
2. 在堆排序的 sift 函数中,比较的应该是 tmp 和 a[son],而不是 a[parent] 和 a[son]。
3. 在堆排序的循环中,交换 a[0] 和 a[i] 后,应该对 a[0] 进行 sift 调整,而不是对 a[i] 进行 sift 调整。因为 a[i] 已经排好序了,不需要再调整。
阅读全文