空间复杂度O(1)的排序算法
面试遇到的一道排序题,记录一下 2020.7
空间复杂度
首先不熟悉空间复杂度的概念:
一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。
(1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
(2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)) 其中n为问题的规模,S(n)表示空间复杂度。
O(1)的解释:
空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)
废话不多说,上代码:
题目:给出一个任意整形数组,将数组中值为0的元素放到数组末尾,其他元素按照升序排列,要求:空间复杂度O(1),例如:
输入[0,4,0,7,5]
输出[4,5,7,0,0]
算法1、冒泡排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print_array(int *array, int length)
{
int index = 0;
printf("array:\n");
for(; index < length; index++){
printf(" %d,", *(array+index));
}
printf("\n\n");
}
void bubbleSort(int array[], int length)
{
int i = 0, j = 0, k = 0, tmp = 0;
if (1 >= length) return;// 判断参数条件
for(i = 0; i < length; i++){
for(j = i+1; j < length; j++){
if(array[0] == 0){
for(k = length-1;k>i;k--){
if(array[k] != 0){
length--;
break;
}
else
length--;
}
array[0] = array[k];
array[k] = 0;
}
if(array[j] == 0){
for(k = length-1;k>j;k--){
if(array[k] != 0){
length--;
break;
}
else
length--;
}
array[j] = array[k];
array[k] = 0;
}
if(array[i] > array[j]){
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
}
int main(void)
{
int array[12] = {0,0,11,4,0,6,9,0,3,7,0,0};
print_array(array, 12);
bubbleSort(array, 12);
print_array(array, 12);
return 0;
}
2、插入排序法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void InsertSort(int *array, int length)
{
int i = 0, j = 0, k = 0;
int tmp = 0;
if(array[0] == 0){
for(k = length-1;k>0;k--){
if(array[k] != 0){
length--;
break;
}
else
length--;
}
array[0] = array[k];
array[k] = 0;
}
for (i = 1; i < length; i++) {
if(array[i] == 0){
for(k = length-1;k>i;k--){
if(array[k] != 0){
length--;
break;
}
else
length--;
}
array[i] = array[k];
array[k] = 0;
}
j = i;
tmp = array[i];
while (j - 1 >= 0 && tmp < array[j - 1]){
array[j] = array[j - 1];
j--;
}
array[j] = tmp;
}
}
void print_array(int *array, int length)
{
int index = 0;
printf("array:\n");
for(; index < length; index++){
printf(" %d,", *(array+index));
}
printf("\n\n");
}
int main(void)
{
int array[12] = {0,0,11,4,0,6,9,0,3,7,0,0};
print_array(array, 12);
InsertSort(array, 12);
print_array(array, 12);
return 0;
}
下篇写关于时间复杂度的算法