#include
intquick_select
(int a,
int l,
int r,
int k)
//這裡將a【p】與最後乙個數交換,它為什麼要這樣做請看接下來的**
int i = l, j = r;
//首先把l和r賦值給i和j
while
(i < j)
//在這一步我們也會發現最後面的元素已經被i所在的元素賦值了,而當前的i還存著應該放在後面的值,所以後面會把這個值替換
while
(i < j && a[j]
> x) j--
;//從尾部往前走,找出比x大的值 放在i的位置,通過上面的步驟,你會發現那個i的值已經存放在別的地方
if(i < j)
//第一次操作從頭比較時,當i=0時就陣列就換成了49,38,97,13,65,76,49(x儲存了27,所以不用擔心!),然後j=5;
}//從後開始比較時,j=3時,13<27,所以放在i的地方,即取代49,變成13,38,97,13,65,76,49(後面是一樣的)
a[i]
= x;
//通過上面的迴圈操作,就會發現最後i=j,同時i左邊的數都比x小,i右邊的數都比x大,最後把缺少的數(也就是x)放上去
p = i;
if(i - l +
1== k)
return a[i]
;//如果滿足條件,就說明這就是要找的數所以直接返回這個值
if(i - l +
1< k)
return
quick_select
( _______a,i+
1,r,k-
(i-l+
1)______________________ )
;//填空
else
return
quick_select
(a, l, i -
1, k)
;//通過分析i-l+1 和k 的大小來進行選擇操作,因為此時i - l + 1的值大小就是這個值在排序後的位置
}//選擇操作:如果i-l+1比k大,那就說明k所代表的值在左邊,否則就在右邊,然後再進行重複的遞迴操作
intmain()
;printf
("%d\n"
,quick_select
(a,0,14
,5))
;return0;
}
#include
int main (
) k = n/2;
while
( k >0)
a[j+k]
= t;
} k = k/2;
}for
( i =
0; i < n; i++
)return0;
}
堆排序(最小堆性質)
#include
int h[
101]
;int n;
void swap (
int x,
int y )
void siftdown (
int i )
if( t != i )
else
flag =1;
}return;}
void creat (
)return;}
int deletemax (
)int main (
)
快速排序小結
快速排序 1 基本思想 在待排序的陣列的 n 個元素中取乙個元素 一般取第乙個 將其移動到這樣的位置 在其之前的元素的值都小於它,在其之後的元素都大於它,這樣是一趟快速排序 然後對陣列的兩個部分進行同樣的操作,直到每部分只有乙個記錄為止 總之,每趟使表的第乙個元素放在適當位置,將表兩分,再對兩子表進...
排序演算法小結
1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...
排序演算法小結
1 歸併排序 3.區別與聯絡 遞迴是從未知推到已知,相當於把未知的東西壓入棧,等到可以算出結果了,就一步一步出棧。迭代是從已知到未知,從已知的東西一步一步推至目標。遞迴與迭代就好像一對逆元。遞迴的 更加清晰,但開銷更大,也更容易出錯,除錯較困難 而迭代的 編寫更困難,但速度和開銷較小。4.空間占用 ...