排序
术语
稳定: a 原本在b的前边,a = b , 排序后 a 还在b的前边 不稳定:a 原本在b的前边,a = b , 排序后 a可能会出现b的后边 内排序 所有排序操作都是在内存完成的 外排序 数据太大,需要给数据存到磁盘,通过数据传输,进行排序 时间复杂度:程序运行的时间,一个算法中,语句的执行次数, T(n) n 数据的规模, T(n) = n^2 + 2*n + c 大O阶表示 取 最高次数 常见的复杂度: O(1) O(n) O(logn) O(n^2) O(n^3)...... O(n^k) 空间复杂度 程序运行所花费的空间。
冒泡排序
依次比较相邻的两个元素, 如果 a[i] > a[i+1] 需要交换,
执行n-1 上边操作 #include <iostream> #include <algorithm> using namespace std;
int main() {
int a[105];
int n;
cin >> n;
for(int i = 0 ; i < n ; ++i) {
cin >> a[i];
}
/*冒泡排序*/
for(int i = 0; i < n -1 ; ++i) {
for(int j = 0; j < n-1-i; ++j) {
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
} }
for(int i = 0 ;i < n ; ++i) {
cout << a[i] << " ";
} return 0; }
选择排序
依次寻找第i小元素,让它与第i个元素交换位置
执行 n - 1 次 #include <iostream> #include <algorithm> using namespace std;
int main() {
int a[105]; int n; cin >> n;
for(int i = 0 ; i < n ; ++i) {
cin >> a[i];
} /*选择排序*/
for(int i = 0 ; i < n-1){
int pos = i;
for(int j = i+1; j < n; ++j) {
if(a[j]<a[pos])
pos = j;
}
swap(a[i],a[pos]);
}
for(int i = 0 ;i < n ; ++i) {
cout << a[i] << " ";
}
return 0; }
插入排序
第一个元素是有序
依次取出下一个元素,在前边已经有序的序列里,把它放在合适的位置 #include <iostream> #include <algorithm> using namespace std;
int main() {
int a[105];
int n;
cin >> n;
for(int i = 0 ; i < n ; ++i) {
cin >> a[i];
}
/*插入排序*/
for(int i = 1; i < n; ++i) {
int key = a[i];
int j = i - 1;
// [0,j] 区间是有序的
while(j>=0&&key<a[j]){
a[j+1] = a[j];
j--;
}
a[j + 1] = key;
}
for(int i = 0 ;i < n ; ++i) {
cout << a[i] << " ";
}
return 0; }
快速排序
堆排