vlambda博客
学习文章列表

C++ 插入排序,冒泡排序和选择排序

大学的时候学过C,现在已经忘得七七八八了,现在想再学一下C/C++。

刚试着重写/温习了3个最简单的排序算法。

插入排序:依次将右边未排序的元素插入到左边已排序序列的合适位置。

时间复杂度:O(n^2)

float* sort_insertion(float a[], int len_a){ /*插入排序 类似我们排序扑克牌*/ for(int i=1; i < len_a; i++) { float to_insert = a[i]; // 索引0到 i-1 已排好序 int j; for(j = i-1; a[j] > to_insert and j >=0 ; j--) a[j+1] = a[j];//大的往后退一位 a[j+1] = to_insert;//a[j] > to_insert 不成立时 j+1的值即是待插入的位置 } return a;}


冒泡排序和选择排序大学都学过,不再赘述。

冒泡排序:

时间复杂度O(n^2)

float* sort_bubble(float a[], int len_a){ /*冒泡排序 依次比较相邻的两个元素,如果顺序错误就将它们的位置交换 */ float temp; for(int i=0; i < len_a-1; i++) { for(int j =0 ;j<len_a-1-i; j++) { if (a[j] > a[j+1]) { temp = a[j]; a[j] = a [j+1]; a[j+1] = temp; } } } return a;}


选择排序:

时间复杂度O(n^2)

float* sort_selection(float a[], int len_a){ /*选择排序 依次将左边未排序序列中的最大元素,存放到右边已排序序列的左端 */ int j; float temp; for(int i= len_a-1; i >= 0; i--) { //未排序序列:a[0]到a[i] //找到未排序序列的最大元素的位置 int maxIndex = 0; for(j=1; j <= i; j++) { if (a[j] > a[maxIndex]) maxIndex = j; } //交换 temp = a[i]; a[i] = a[maxIndex]; a[maxIndex] = temp; } return a;}


随机数组生成部分的代码如下:

#include <iostream>#include <time.h>using namespace std;float* sort_insertion(float a[], int len_a);float* sort_bubble(float a[], int len_a);float* sort_selection(float a[], int len_a);
int main(){ const int len_b =100; float b[len_b]; //int len_b = sizeof(b)/sizeof(b[0]);//求数组长度 srand(time(NULL)); //srand()设置随机种子seed, seed 随时间变化 for (int i=0; i<len_b; i++) { b[i] = rand()%101 -50.0f;//随机数 -50 到 50 //cout <<b[i]<<endl; } sort_bubble(b,len_b); //cout<<endl; for (int i=0;i<len_b;i++) cout<<b[i]<<endl; return 0;}