冒泡
void BubbleSortArray()
{
int i,j,temp;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]>a[j+1]) //比較交換相鄰元素
{
temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
}
}
}
}
快速排序
快速排序(Quicksort)是對(duì)冒泡排序的一種改進(jìn)始苇,它的基本思想是:通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小默辨,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行一铅,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。
時(shí)間復(fù)雜度為O(nlog2n),適用于排序大列表姜凄。
void swap(int a,int b){int t;t =a ;a =b ;b =t ;}
int Partition(int [] arr,int low,int high)
{
int pivot=arr[low]; //采用子序列的第一個(gè)元素作為樞紐元素
while (low < high)
{
//從后往前在后半部分中尋找第一個(gè)小于樞紐元素的元素
while (low < high && arr[high] >= pivot)
{
--high;
}
swap(arr[low], arr[high]);//將這個(gè)比樞紐元素小的元素交換到前半部分
//從前往后在前半部分中尋找第一個(gè)大于樞紐元素的元素
while (low <high &&arr [low ]<=pivot )
{
++low ;
}
swap (arr [low ],arr [high ]);//將這個(gè)樞紐元素大的元素交換到后半部分
}
return low ; //返回樞紐元素所在的位置
}
void QuickSort(int [] a,int low,int high)
{
if (low <high )
{
int n=Partition (a ,low ,high );
QuickSort (a ,low ,n );
QuickSort (a ,n +1,high );
}
}
ArrayList和Vector的區(qū)別,HashMap和Hashtable的區(qū)別以及線程安全的理解
就ArrayList與Vector主要從二方面來(lái)說(shuō).
- 同步性:Vector是線程安全的,也就是說(shuō)是同步的趾访,而ArrayList是線程序不安全的态秧,不是同步的
- 數(shù)據(jù)增長(zhǎng):當(dāng)需要增長(zhǎng)時(shí),Vector默認(rèn)增長(zhǎng)為原來(lái)一培,而ArrayList卻是原來(lái)的一半
就HashMap與HashTable主要從三方面來(lái)說(shuō)扼鞋。
- 歷史原因:Hashtable是基于陳舊的Dictionary類的申鱼,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)
- 同步性:Hashtable是線程安全的,也就是說(shuō)是同步的云头,而HashMap是線程序不安全的捐友,不是同步的
- 值:只有HashMap可以讓你將空值作為一個(gè)表的條目的key或value
什么是線程安全?
如果你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行盘寡,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼楚殿。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的竿痰,就是線程安全的脆粥。或者說(shuō):一個(gè)類或者程序所提供的接口對(duì)于線程來(lái)說(shuō)是原子操作或者多個(gè)線程之間的切換不會(huì)導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說(shuō)我們不用考慮同步的問(wèn)題影涉。
舉例
比如一個(gè) ArrayList 類变隔,在添加一個(gè)元素的時(shí)候,它可能會(huì)有兩步來(lái)完成:
- 在 Items[Size] 的位置存放此元素蟹倾;
- 增大 Size 的值匣缘。
在單線程運(yùn)行的情況下,如果 Size = 0鲜棠,添加一個(gè)元素后肌厨,此元素在位置 0,而且 Size=1豁陆;
而如果是在多線程情況下柑爸,比如有兩個(gè)線程,線程 A 先將元素存放在位置 0盒音。但是此時(shí) CPU 調(diào)度線程A暫停表鳍,線程 B 得到運(yùn)行的機(jī)會(huì)。線程B也向此 ArrayList 添加元素祥诽,因?yàn)榇藭r(shí) Size 仍然等于 0 (注意哦譬圣,我們假設(shè)的是添加一個(gè)元素是要兩個(gè)步驟哦,而線程A僅僅完成了步驟1)雄坪,所以線程B也將元素存放在位置0厘熟。然后線程A和線程B都繼續(xù)運(yùn)行,都增加 Size 的值。
那好绳姨,現(xiàn)在我們來(lái)看看 ArrayList 的情況颇玷,元素實(shí)際上只有一個(gè),存放在位置 0就缆,而 Size 卻等于 2。這就是“線程不安全”了谒亦。
java中的native關(guān)鍵字
native修飾的拾非java語(yǔ)言代碼接口竭宰,一般有實(shí)現(xiàn)體,不修飾abstract