手搖演算法(三重翻轉演算法)和空間複雜度為o(1)的歸併排序
http://blog.csdn.net/ltyqljhwcm/article/details/52155097?locationNum=6&fps=1這篇文章對手搖演算法以及歸併排序有很詳細的講解!!
手搖演算法就是空間複雜度為O(1),僅僅是依靠交換操作來對字串進行處理。
利用手搖演算法實現歸併排序,主要需要三個變數:
i指向右邊待排序列將要插入的左邊序列的位置;
index指向右邊待排序列的初始位置;
j指向右邊待排序列的末尾位置的後一個位置;
也就是將右邊index-----j-1之間的序列插入到左邊i的前面的位置;也就是將index-------j-1和i-------index-1這兩個資料塊交換位置;
class MergeSort {
public:
int* mergeSort(int* A, int n) {
// write code here
mergeSort(A,0,n-1);
return A;
}
void mergeSort(int* A,int start,int end){
if(start>=end)
return;
int middle=(start+end)/2;
mergeSort(A,start,middle);
mergeSort(A,middle+1,end);
merging(A,start,middle,end);
}
void merging(int* A,int start, int middle, int end){
int i=start;
int index=middle+1;
int j=middle+1;
while(j<=end&&i<j){
while(A[i]<=A[j]&&i<j){
i=i+1;
}
if(i>=j)
break;//說明此時已經排序結束
while(A[j]<A[i]&&j<=end){
j=j+1;
}
reverse(A,index,j-1);
reverse(A,i,index-1);
reverse(A,i,j-1);
i=i+(j-index);
index=j;
}
}
void reverse(int* A,int left,int right){
if(left==right)
return;
while(left<=right){
int temp;
int* p;
int* q;
p=&A[left];
q=&A[right];
temp=*p;
*p=*q;
*q=temp;
left=left+1;
right=right-1;
}
}
};
對於上面的歸併排序來說,空間複雜度為o(1),而時間複雜度為O(n*logn)--O(n*n*logn)。
相關推薦
手搖演算法(三重翻轉演算法)和空間複雜度為o(1)的歸併排序
http://blog.csdn.net/ltyqljhwcm/article/details/52155097?locationNum=6&fps=1這篇文章對手搖演算法以及歸併排序有很詳細的講解!! 手搖演算法就是空間複雜度為O(1),僅僅是依靠交換操作來對字串
已知長度為n的線性表A採用順序儲存結構,請寫一個時間複雜度為O(n)、空間複雜度為O(1)的演算法,該演算法可刪除線性表中所有值為item的資料元素。
語言:C++ #include <iostream> using namespace std; typedef int ElemType; //定義 #define MAXSIZE 100 typedef struct {ElemType *elem; int length;}Sq
編寫程式,在一非遞減的順序表L中,刪除所有值相等的多餘元素。要求時間複雜度O(n),空間複雜度為O(1)
翠花上程式碼: Status delExcrescentValue(SeqList &S){ int flag = 0,val = S.elem[0];//記錄值不等的下標 //printf("%d\n",S.elem[0]); for(int i = 1;i
已知順序表L中的元素為int,請寫一時間複雜度O(n)、空間複雜度為O(1)的程式,將L中的奇數元素排在前面,偶數元素排在後面
Status exchangeEvenOddNumbers(SeqList &S){ int j = 0,k = 0; for(int i = 0;i<=S.last;i++){ if(S.elem[i]%2 == 1){ k
設計一個演算法,將連結串列中所有結點的連結串列方向“原地”逆轉,即要求僅利用原表的儲存空間,換句話說,要求演算法的空間複雜度為O(1)。
語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li
一個時間複雜度為O(n)的排序演算法,空間複雜度為O(1)
package test; import java.util.HashSet; import java.util.Set; public class Test { public st
實現一個棧,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值)的時間複雜度為O(1)
這道題考查棧的知識點,要求實現一個棧,在對這個棧進行入棧和出棧以及返回最小棧元素時要求時間複雜度為O(1)。 方法一: 用兩個棧,一個正常出入棧,另一個存最小棧,入棧的時候第一個站正常入,最小棧如果為空或者要入的data比最小棧的棧頂元素小的時候才給最小棧入棧。
【面試題】實現一個棧,要求Push(入棧),Pop(出棧),Min(返回最小值的操作)的時間複雜度為O(1)
問題描述:實現一個棧,要求Push(入棧),Pop(出棧),Min(返回最小值的操作)的時間複雜度為O(1) 分析問題:要記錄從當前棧頂到棧底元素的最小值,很容易想到用一個變數,每push一個元素更新一次變數的值。那麼問題來了,當執行pop操作時,上一次的最小值就找不到
設任意n個整數存放於陣列A[1..n]中,試編寫演算法,將所有正數排在所有負數前面(要求:演算法時間複雜度為O(n))。
注意陣列的實際長度 #include <iostream> using namespace std; void sort(int A[],int n) { int i=0;//陣列的頭下標 int j,x; j=n-1;//陣列的尾下標 while
時間複雜度為O(n)的排序演算法
我們常用的幾種排序演算法,氣泡排序,選擇排序,它們已經是相對比較簡單,穩定的排序演算法了,但是它們時間複雜度為O(n*n),基本都要用到兩層迴圈,今天我就像大家介紹一種簡單,只用一層for迴圈,時間複雜度為O(n)的排序演算法。 樣例輸入:1 4 5 6 3 4 2 8 9 1 樣例輸出
有1,2...一直到n的無序陣列,求排序演算法,並且要求時間複雜度為O(n),時間複雜度為O(1)
提示:用陣列值作為下標 分析: 對於一般陣列的排序顯然 O(n) 是無法完成的。 既然題目這樣要求,肯定原先的陣列有一定的規律,讓人們去尋找一種機會。 例如:原始陣列: a = [ 10, 6,9, 5,2
第4章 貪心演算法,Dijkstra演算法(鄰接矩陣儲存,時間複雜度為O(n^2))
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #d
實現一個棧,要求實現出棧、入棧、返回最小值的時間複雜度為O(1)
由棧的一些基本操作,很容易使出棧和入棧的時間複雜度為O(1),但是由於入棧資料元素順序不一定是有序的,故不能直接實現返回最小值的時間複雜度為O(1)。下面提供兩種方法: (一)設定一個特殊的資料結構型別,包括兩個棧_data棧和_mindata棧,_data棧和原來的棧
【劍指offer】二維陣列中的查詢——複雜度為O(n+m)——採用PHP寫法
背景 今天偶然進入牛客網,看到《劍指offer》模組有演算法題,就開始試著答題 題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣
一個時間複雜度O(n),空間複雜度為O(1)的排序演算法
其實就是利用Hash的思想,開闢一個固定長度的hash陣列用於標記待排序陣列的資料元素是否出現過。由於固定長度的hash陣列,所以空間複雜度與待排序陣列資料規模n沒有關係,也就是說空間複雜度為O(1)。
n個數中找最大的k個數問題求解(要求複雜度為O(n))
首先我們都知道可以將n個元素建一個最(大|小)堆,O(n)。 下面一個很常見的做法就是,每步從堆頂拿掉一個元素,拿k次,就把前k個元素拿出來了。但問題是,每步拿掉一個元素之後,都需要log(n)的時間來將堆再次最(大|小)化。所以拿k次的複雜度就是 klog(n)。有沒
時間複雜度為O(N*logN)的常用排序演算法總結與Java實現
時間複雜度為O(N*logN)的常用排序演算法主要有四個——快速排序、歸併排序、堆排序、希爾排序1.快速排序·基本思想 隨機的在待排序陣列arr中選取一個元素作為標記記為arr[index](有時也直接選擇起始位置),然後在arr中從後至前以下標j尋找比arr[inde
同時找出陣列的最大值和最小值,要求時間複雜度為o(n)
#include <stdio.h> void max_min(int A[],int n,int& max,int& min) { int i; if(n%2==0) { if(
長度為n的順序表L,編寫一個時間複雜度為O(n),空間複雜度為O(1)的演算法,該演算法刪除線性表中所有值為X的元素
解法:用K記錄順序表L中不等於X的元素個數,邊掃描L邊統計K,並將不等於X的元素向前放置K位置上,最後修改L長度 void del_x_1(SqList &L,Elemtype x){ int k=0; for(i=0;i<L.length;i++) {
將陣列排序,陣列中所有的負整數出現在正整數前面(時間複雜度為 O(n), 空間複雜度為 O(1)).
<pre name="code" class="plain">#include <stdio.h> #define N 10 void swap (int *a, int i,