1、通過比較相鄰兩個元素,把大的元素放在索引大的位置上,這樣比較n-1-i次後,就將最大的元素冒泡到最後面
2、這樣的過程要找n-1次
時間複雜度:
最好情況已經排好序o(n)
最差情況反序o(n^2)
private
static
void
bubbling(int a,int n)}}
}
private
static
void
bubbling1(int a,int n)
}posend = pos;
}}
氣泡排序改進2:
考慮到每次迴圈只找到最大的值或者最小的值,可以每次找到最小和最大的值嗎?
private static void bubbling2(int a,int n)
}high--;
for(j=high;j>low;j--)
}low++;
}}
分治法的思想
1、取乙個基數(這裡取第乙個元素)
2、讓小於這個基數的數放在基數的左邊,大於這個基數的數放在這個基數的右邊
3、遞迴過程1、2
重要的是過程2,從陣列的兩端遍歷,依次和基數進行判斷,右端如果大於基數(右端一定要先判斷,這樣最後兩端要相遇的時候,
保證了在數值小的地方相遇,然後相遇的地方與基數互換,當然,如果基數選擇的是最後乙個元素,那麼就要從左端開始判斷),
那麼++,左端如果小於基數,那麼–,當找到了右端的小於基數的值和左端的大於基數的值,如果左右兩端沒有遇到,交換這兩
個值,然後再判斷左右兩端是否遇到,如果沒遇到,那麼繼續這個過程,直到左右兩端遇到。
例如:3,9,5,2,6,1;1與9交換3,1,5,2,6,9;2與5交換3,1,2,5,6,9;這時high==low,2與3交換2,1,3,5,6,9,
這樣2,1在3的左邊,而5,6,9在3的右邊。
時間複雜度:
最好的情況是每次把上一次的陣列平均分成兩個子陣列。設陣列總數一共為n,如果把這n個數每次分成2半最後每個陣列只
包含乙個元素,假設要分k次,則2的k次方=n,解得k=log2n(log以2為底對n取對數).也就是說要分log2n次,而每次都
是處理n個資料。所以總的時間複雜度為o(nlog2n)。
private static void quicksort(int a,int
left,int
right)
while(lowif(lowleft]=a[low];
a[low]=key;
quicksort(a,left,low-1);
quicksort(a,low+1,right);
}}
從陣列第二個元素開始(第乙個元素已經排好序)當作插入值key,先判斷key是否比它左邊的哥們大,如果比它左邊的哥們大,那麼不需要插入,就在原位置就行了,
將key與排好序的從右到左依次作比較,如果key一直是小數,那麼就將比較值往右移位,直到找到乙個小於等於key或者找到最後乙個,就在這個位置上將key插入。
時間複雜度:
最好的情況下陣列已經排好序,線性複雜度o(n)
最差的情況下逆序o(n^2)
private
static
void
insertsort(int a,int n)
a[j]=key;}}
}
每次從待排序的陣列中找到最小值,然後放在固定的位置
首先設定第乙個元素是最小值,然後遍歷後面的元素與之比較,找出最小值min,記錄最小值的索引index(用於存放被最小值替換下來的值)
時間複雜度:
o(n^2)
private
static
void selectsort(int a,int n)
}temp = a[i];
a[i] = min;
a[index] = temp;
}}
1、建堆
2、將堆頂的元素和最後乙個元素替換,替換完,剩下的元素需要再次調整為堆
3、重複過程2,,直到替換了n-1次,完成排序
private
static
void
heapsort(int a,int n)
}
初始化堆
從最後乙個父節點開始,到堆頂,從下到上調整堆。
private
static
void
buildheap(int a, int n)
}
調整堆:
@parama陣列,n陣列的長度,i要調整的父節點
假設父節點是最大值,如果子節點不超出n(也就是子節點存在),那麼將子節點與父節點比較,將最大值設為父節點,
如果最大值是在子節點中,那麼將子節點的值與父節點的值替換後,被替換的子節點可能就不再是堆,需要調整以子節點為父節點成為堆。
直到子節點是葉子節點為止
private static void adjustheap(int a, int n, int i)
if(rchildmax]max = rchild;
}if(i!=max)
}}
/**
* 歸併排序:
* 將陣列用遞迴進行二分分開,直到高位和低位相鄰的時候,分開結束,進行歸併排序
*@param a 待排序的陣列
*@param low 低位
*@param high 高位
*/private
static
void
mergesort(int a, int low, int high)
}
/**
* 將陣列a[low,mid]和a[mid+1,high]歸併排序到乙個新陣列,這個過程是這樣的:
* 1、取a[low]和a[mid+1]進行比較,然後將小者放進新陣列,新陣列位置+1,low+1,
* 大者也放進新陣列中,新陣列位置+1,mid+1+1,這個過程直到兩個陣列有乙個到達盡頭
* 2、將兩個陣列剩下的部分也放進新陣列中
* 3、這樣這個新資料就是兩個待排序的資料的歸併排序陣列,將這個新陣列複製到最終要排序的陣列a中,排序結束。
*@param a 帶排序
*@param low 低位
*@param mid 中位
*@param high 高位
*/private
static
void
merge(int a, int low, int mid, int high)
}while(i<=mid)
while(j<=high)
for(i=0;i}
快速排序的那些事
快速排序是最經典的演算法之一,應用無數,平均時間複雜度 nlgn 最差時間複雜度 n2 空間複雜度主要看呼叫深度,平均o lgn 最差o n 快速排序的分治思想可以用在很多地方,比如 一堆數中最大的幾個數等。通常在程式中直接使用庫函式即可,c語言qsort,c sort。用法,void qsort ...
那些人,那些事
很久沒有整理一下自己的思緒,聽著熟悉的歌,那歌聲會讓我想起那些人,那些事.乙個標點,乙個符號,乙個個早已在歲月深處冰封的眼神,一段沒有伴侶的歸途。一直以來我都認為我的人生就是這樣,平平淡淡,安安靜靜,波瀾不驚地在歲月的 眼角劃過,不留絲毫痕跡。現在看來,原來我寫的東西在很大程度上是是在滿足自己的某種...
那些人,那些事
一年前的今天,我大概和bi11一起奔波於各大招聘會上,白天各睡各的覺,晚上一起在工作室寫著程式 那時候似乎成都已經很冷,工作室有著溫暖的空調.而現在猛烈的陽光一件薄薄的襯衫真讓我不敢相信已經是十一月了.我在成都待了四年,說實話我不喜歡成都,不過還是有著很多讓人快樂的人和事給了我很多快樂的回憶.先說說...