简单排序:选择排序,冒泡排序,插入排序
1选择排序:从数组中每次挑选一个最小值,与放在设置好的位置,时间复杂度上下界都是n^2
代码实现: PS.没有给出main函数,只给出了排序函数的算法
void paixv(int arr[], int n) {
int i, j, min , k = 0;
for (i = 0; i < n; i++) {//外循环控制轮数
min = i;
for (j = i + 1; j < n; j++) {//内循环进行比较
if (arr[j] < arr[min]) {
min = j;
}
}
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
//输出函数
for (i = 0; i < n; i++) {
cout << arr[i];
if (i < n - 1) {
printf(" ");
}
}
}
选择排序耗时(PTA 排序题OJ
2冒泡排序:对数组中相邻的两元素进行比较,如果左大于右则交换位置.时间复杂度下界n,上界n^2
void paixv(int arr[], int n) {
int p = n, i, j;
int x;
int flag;
for (i = p; i > 0; i--) {
flag = 0;//用来判断当前排序是否已经不需要再变动 flag=1时说明数组进行了一次变动 等于0说明没有执行交换,数组已经有序,此时可以退出循环
for (j = 0; j < i-1; j++) {//从第1个开始,也就是数组第0个 结束是i-1 即数组最后一项
if (arr[j] > arr[j + 1]) {
x = arr[j+1];
arr[j + 1] = arr[j];
arr[j] = x;
flag = 1;
}
}
//当以上的if判断一次都没被调用过,证明序列已经有序,可以直接跳出循环
if (flag == 0) {
break;
}
}
for (i = 0; i < n; i++) {
cout << arr[i] ;
if (i < n-1)
{
printf(" ");
}
}
}
冒泡排序耗时:
3插入排序:从待排序列中抽一个数放到有序序列中,通过每次比较大小从而插入数生成一个新的有序序列.时间复杂度下界n,上界n^2
对于基本有序的序列来说插排的速度比较快
void paixv(int arr[], int n) {
int i, j, temp;
for (i = 1; i < n; i++) {//从数组第一项开始
temp = arr[i];
for (j = i; j > 0 && arr[j - 1] > temp; j--) {//从头开始比较,如果前者大于后者,互换
arr[j] = arr[j - 1];
}
arr[j] = temp;
}
for (i = 0; i < n; i++) {
cout << arr[i];
if (i < n - 1) {
printf(" ");
}
}
}
插排耗时:(其中倒数第二项是相对有序的序列,可以看到耗时比上面的短很多
以上三种仅以交换相邻两元素的排序算法有插排和冒泡,平均时间复杂度下界都是n^2,主要优点是简单,但是当数据量大并且相对无序的时候,排序的时间往往很久.
最坏情况下,选择排序的耗时比冒泡排序的要短,因为冒泡每一次比较为真后需要相邻两数交换,选择排序每次查找只会找到最小的数,然后放入预先设置好
的位置中.而插入排序对于基本有序的数据而言非常的快,