排序算法

空间复杂度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;
}

下篇写关于时间复杂度的算法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值