课本章节课后题 | 第六章 指针 | 第五章数组 | |
---|---|---|---|
课本章节总结 | 第六章 指针 | 第七章 用户自定义数据类型(结构体,链表,动态) | |
总结 | 排序总结 | 错题 | 题型 |
1冒泡排序
方式:小数上浮,大数下沉,两两比较,两两交换
特点:n个数,循环n-1次
第i趟,n-1次交换
优化方法:
1.第i轮从i+1开始比较
2.每次循环比较先进性判断:若上一轮没有发生交换,则已经排好序,不需要再进行下一轮比较
#include<iostream>
using namespace std;
int main()//降序
{
int a[5] = { 1,2,3,4,5 };
int i = 0,j=0;
int max;
for (i = 0; i < 4; i++)
{
max = i; flag = 0;
for (j = i + 1; j < 5; j++)
{
if (a[j] > a[max])
{
max = j;
}
}
if (max!=i)
{
float swap;
swap = a[i];
a[i] = a[max];
a[max] = swap;
}
}
for (i = 0; i < 5; i++)
{
cout << a[i] << " ";
if (i == 4)
{
cout << '\b' << endl;
}
}
return 0;
}
2折半查找
#include<iostream>
using namespace std;
int main()
{
int a[5] = { 1,2,4,5,6 },n,mid,top=4,low=0,ti;
bool prime=false;
cin >> n;
while (top>=low)
{
mid = (low + top) / 2;
if (a[mid] == n) {
cout << "site:" << mid << endl; prime = true; break;
}
else if (a[mid] > n)top = mid - 1;
else low = mid + 1;
}
if (!prime)cout << "unsearch" << endl;
}
移动的是两端top和low
3选择排序
最简单:寻找最值并记录,两两交换
#include<iostream>
using namespace std;
int main()
{
void f(char**a, int n);
int i;
char ch[4][15] = { "apple","pear","ine cream","banana" };
char* a[4];
for (i = 0; i < 4; i++)a[i] = ch[i];
f(a, 4);
for (i = 0; i < 4; i++)
cout << ch[i] << endl;
for (i = 0; i < 4; i++)
cout << a[i] << endl;
}
void f(char**a, int n)
{
int i,j,ll;
char*temp;//仅仅只是改变了指针数组对于二维数组的指向,而没有改变对于原来二维字符数组的更改
for (i = 0; i < n - 1; i++)
{
ll = i;
for (j = i + 1; j < n; j++)
if (strcmp(a[ll], a[j]) < 0)ll = j;
if (ll != i) {
temp = a[i]; a[i] = a[ll]; a[ll] = temp;
}
}
}
sort函数
1)两个参数(默认升序)
前面是要排顺序的数组的首地址
后面是最后一个要排序的地址+1
while (cin >> n)
{
int*a=new int[n];
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);//升序
cout<<a[0];
for(int i=1;i<n;i++)
cout<<' '<<a[i];
cout<<endl;
}
2)三个参数
bool compare(int a, int b) {
return a > b; //降序排列,如果改为return a<b,则为升序
}
///
sort(c, c + all, compare);//all表示数组中一共有all个元素