归并排序 空间复杂度为O(1)的做法

 #include <iostream>
 #include <cstdlib>
 using namespace std;
 void print(int *arr, int start, int end)
 {
	for (int i = start; i <= end; ++i)
		cout << arr[i] << ‘ ‘;
	cout << endl;
 }
 void randData(int *arr, int start, int end)
 {
	for (int i = start; i <= end; ++i)
		arr[i] = rand() % 20;
	print(arr, start, end);
 }

void merge(int *arr, int start, int mid, int end)
{
	int i, j, k, key;
	i = start;
	j = mid;
	while (i < j && j <= end)  //当i等于j或者j到达末尾时终止
	{
		if (arr[i] > arr[j])
		{
			k = j;
			key = arr[j];
			while (k > i && arr[k - 1] > key)
			{
				arr[k] = arr[k - 1];
				--k;

			}
			arr[k] = key;
			++j;
		}
		++i;
	}
}
void mergeSort(int *arr, int start, int end)
 {
	if(start < end)
	{
		int mid = (end + start) / 2;
		mergeSort(arr, start, mid);
		mergeSort(arr, mid + 1, end);
		merge(arr, start, mid + 1,end);
		print(arr, start, end);
	}
 }
 /*11 4 2 13 12 2 1 16 18 15*/
 int main()
 {
	bool bIsContinue = true;
	char ch = ‘n‘;
	const int Len = 10;
	int arr[Len];
	print(arr, 0, Len - 1);

	while (true == bIsContinue)
	{
		randData(arr, 0, Len - 1);
		mergeSort(arr, 0, Len - 1);
		cout << "the new array: ";
		print(arr, 0, Len - 1);
		cout << "please input yes or no" << endl;
		cin >> ch;
		if (ch == ‘y‘ || ch == ‘Y‘)
			bIsContinue = true;
		else
			bIsContinue = false;
	}
    return 0;
 }
时间: 2024-10-11 13:40:50

归并排序 空间复杂度为O(1)的做法的相关文章

二路归并排序

package algrithm; import java.util.Scanner; public class Sort { public static void mergeSort(int a[], int l, int r) { if (l >= r) return; int mid=(l+r)/2; mergeSort(a, l, mid); mergeSort(a, mid+1, r); merge(a, l, mid, r); } //二路归并排序空间复杂度为O(n),时间复杂度为O

[LeetCode]148. Sort List链表归并排序

要求时间复杂度O(nlogn),空间复杂度O(1),采用归并排序 传统的归并排序空间复杂度是O(n),原因是要用一个数组表示合并后的数组,但是这里用链表表示有序链表合并后的链表,由于链表空间复杂度是O(1),所以可以. 链表问题经常出现TLE问题或者MLE问题,这时候要检查链表拼接过程或者循环过程,看有没有死循环 public ListNode sortList(ListNode head) { if (head==null||head.next==null) return head; //利用

高级排序算法之归并排序,快速排序

前言 承接上文基础排序算法-冒泡,插入,选择,相比之下,归并排序和快速排序更为高效,时间复杂度均为O(nlogn),相比简单排序的O(n^2)好了很多,下面介绍一下这两种算法的思路,实现和主要指标.主要思路来自<数据结构与算法之美> 正文 归并排序 主要思路 在归并排序采用分冶的思想,使用递归实现.描述如下 开始归并排序 如果数组元素小于两个,无需排序,结束 否则需要排序,归并排序数组左侧,归并排序数组右侧,按序合并左右侧 采用的是自顶至下的思路,例如[1,5,3,7,4,6],左侧为[1,5

各种排序算法代码汇总

计算机随机生成10000个数,让算法排序.花费时间如下: 代码: // KindsOfSort.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <cstdlib> #include <ctime> using namespace std; #define N 10000 //插入排序 稳定的排序算法 时间复杂度O(n^2) void insert_sor

《剑指offer》孩子们的游戏(圆圈中最后剩下的数)

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 每年六一儿童节,NowCoder都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF

九种经典排序算法汇总

/*********************************************************** 总结各种排序算法包括但不限于: 1. 插入排序类 1.1 直接插入排序 1.2 二分插入排序 1.3 希尔排序 2. 交换排序类 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 直接选择排序 3.2 堆排序 4. 归并排序 5. 基数排序 以上所有排序算法的实现均为将整形数组data递增排序 ************************************

常见排序算法汇总

                                           排序算法汇总 在笔试面试的过程中,常常会考察一下常见的几种排序算法,包括冒泡排序,选择排序,插入排序,希尔排序,快速排序,堆排序归并排序等7种排序算法,下面将分别进行讲解: 1.冒泡排序 所谓冒泡排序法,就是对一组数字进行从大到小或者从小到大排序的一种算法.具体方法是,相邻数值两两交换.从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不同,则将两个数的位置进行交换(对调):如果其与我们的期望一致,则不用交

Leetcode 448.找到所有数组中消失的数字

找到所有数组中消失的数字 给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内. 示例: 输入: [4,3,2,7,8,2,3,1] 输出: [5,6] 时间复杂度为O(n),空间复杂度为O(1)的做法.(符合题目要求的做法,没有使用多余空间).遍历数组,

数据结构中的常见排序

一.基数排序 基数排序的思想比较好理解,即是从各位数开始比较起,一直比较到最高位位置,每次比较都是在前一次比较的基础上进行的. 代码如下: /* 基数排序,即为按照每位数来将其分类,然后在前一次分类的顺序基础上,再次进行分类,直到所有分类标准都执行完毕 时间复杂度为n */ #include <iostream> using namespace std; int GetNumByPos(int num,int dight){ int value=-1; while(dight>0){ v