排序 快排 二分及旋轉陣列的最小數字

2021-07-01 23:48:58 字數 2425 閱讀 1631

旋轉陣列的最小數字:

*把乙個陣列最開始的若干位搬到陣列的末尾,我們稱子為旋轉陣列。輸入乙個遞增排序的旋轉,輸出旋轉陣列中的最小元素。例如陣列為的乙個旋轉,最小元素是1.

直接遍歷也能夠找到最小值,但是這樣沒有用到旋轉的特性,其時間複雜度為o(n),不是優解。

可以把旋轉陣列看成是兩個有序的子陣列,那麼可以用二分查詢的思想的來解決,用兩個指標來分別指向陣列第乙個元素和最後乙個元素,第乙個元素的值一定大於等於最後乙個元素的值(也不完全是,特殊情況是如果把0個元素向後面移動,即還為陣列本身)。

接著我們可以找到中間元素,如果中間元素大於乙個元素,那麼中間元素屬於第乙個子陣列,那麼最小值一定在中間值後面,讓第乙個指標指向中間元素,但任然還 是屬於第乙個陣列,那麼這樣就縮小了搜尋範圍;如果中間元素小於最後乙個元素,那麼中間元素屬於第二個陣列,最小值一定在其前面,讓第二個指標指向中間元素,依然還是屬於第二個陣列的;通樣瘦小了搜尋範圍,重複進行新的一輪查詢,直到兩個指標相鄰,此時第二個指標指向的元素為最小的元素。、

注意:

1、如果把0個元素向後移動,則還為原陣列本身,最小元素為第乙個元素。

2、如果第乙個指標、中間元素、第二個指標指向是值相同,則只能進行順利查詢了。*

**如下:

//找出旋轉陣列的最小元素,應用二分查詢的思想

static int

min(int a,int len)

int index1 = 0;

int index2 = len - 1;

//如果有序數列把0個元素移到到後面去,即旋轉數列為本數列,那麼第乙個元素即為最小

int mid = index1;

while(a[index1] >= a[index2])

//平分為兩個序列

mid = (index1 + index2)/2;

//如果三個的值都相同的,那就只能順利查詢了

if(a[index1] == a[mid] && a[index2] == a[mid])

//mid屬於第乙個數列,index1指向mid

if(a[index1] < a[mid])else

if(a[index2] > a[mid])

//mid屬於第二個數列

index2 = mid;

}return a[mid];

}static int minbyorder(int a, int index1,int index2)

return

min;

}

排序方法

二分查詢

非遞迴實現

static int binsearch(int a,int start,int

end,int key)

intmid = 0;

while(start <= end)

return -1;

}

遞迴實現:

static int binsearchbyback(int a,int start,int

end ,int key)

intmid = (start + end)/2;

if(a[mid] == key)

return mid;

else

if(a[mid] > key)

return binsearchbyback(a,start,mid-1,key);

else

return binsearchbyback(a, mid+1, end, key);

}

快速排序

static int partition(int a,int low,int high) 

a[low] = key;

return low;

}

遞迴實現:

static

void quicksort(int a,int low,int high)

}

非遞迴演算法

static void quicksortloop(int a,int low,int high) 

stack s = new stack();

intm = partition(a,low,high);

if(low < m-1)

if(m+1

< high)

//其實就是用棧儲存每乙個待排序子串的首尾元素下標,下一次while迴圈時取出這個範圍,對這段子序列進行partition操作

while(!s.empty())

if(end > m+1)

}}

陣列 二分查詢 旋轉陣列的最小數字

1.題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。2.class solution return rotatea...

二分法旋轉陣列找最小數

一 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。note 給出的所有元素都大於0,若陣列大小為0,請返回0。示例1輸入 3,4,5,1,2 返回值1 二 思路 這道題要求用二分法,一開始用的是遍歷的方法,時間...

旋轉陣列的最小數字 二分查詢思想

旋轉陣列的最小數字 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。分析 原始陣列為乙個非遞減排序,因此,我們...