所謂氣泡排序就是,一組資料,以遞增的順序來說明,從第乙個數data[0]開始,依次和後面的資料比較大小,如果data[0]大於當前位置上的數就和這個數交換位置並繼續和後面的數相比,如果遇到比自己大的數了,就不交換;下一次開始的位置是data[1],然後依次往後推。
void myswap(int &num1,int &num2)
void bubble_sort(int *array,int num)}}
}
上述**是演算法思想的基本實現,但是如果這個陣列的後一半元素是有序的,效率就低了很多,那麼怎麼優化呢?
思想設定乙個標記位,如果不發生資料交換,說明陣列資料已經有序,那麼就沒必要繼續往下迴圈了,就可以直接退出了,這麼做的好處是可以減少迴圈次數,避免空迴圈的發生。
效率o(n^2)
實現
void bubble_sort_ex(int *array,int num)
}if (flag == false)
}}
思想
每步將乙個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。簡單說,就是將每乙個元素和它前面的每乙個資料相比較,然後根據其數值的大小關係插入到合適的位置上,直到最後乙個元素也完成這種操作。
插入排序的分類有三種,分別為直接插入排序、折半插入排序、希爾排序。
效率o(n^2),和氣泡排序一樣,都是穩定的排序方法,當然它們的效率也是最低的,在資料量很小時,這兩種方法的效率還是不錯的。
實現直接插入排序
void insert_sort(int*array,int num)
else
}array[j+1] = key;
}}
折半插入排序
原理折半插入排序原理很簡單,只有兩步:
第一步,在已經排好序的陣列中找到要插元素的位置;
第二步,將這個位置後面的元素整體向後移動乙個單位,然後插入這個元素;
排序操作做的是迴圈的工作,每一次都是對其中乙個元素操作,直到陣列末尾。
實現
void binary_insert_sort(int*arr,int
len)
cout<<"binary_insert_sort"
else
}for (int j= i;j > left;--j)
arr[left] = tmp;
}}
效率
我認為這種演算法的排序,在陣列中還未出現有序子串行之前,這種操作和直接插入排序的效率是一樣的,而這種相比於直接插入排序的好處在於,如果一開始陣列是基本有序的,那麼陣列就沒必要從起始元素開始迴圈遍歷了,二分效果很明顯;這麼做減少了遍歷的次數,但是程式中在移動元素的時候並沒有改進多少,所以它的時間複雜度依然是o(n^2)。
希爾排序
原理希爾排序也是對直接插入排序的一種改進,它的基本做法是:
對於n個元素的陣列,設定增量h,
第一趟,從第乙個元素開始,隔h位置取下乙個元素,並且邊取邊直接插入這n/h個元素;
第二趟,從第二個元素開始,隔h位置取下乙個元素,和上面一樣;
。。。
第h趟,從第h個元素開始,和上面一樣的操作;
(注意:此時陣列還不是有序的)
減小h的值,重複上面的操作,直到h的值為1,然後排序完成。
實現
void shell_sort(int *arr,int
len)
cout<<"shell_sort"
for (;h >0;--h)
arr[j+h] = tmp;}}
}}
效率
雖然說希爾排序是直接插入排序的一種改進,但是效率上並沒有多少提高,時間複雜度,額,還是o(n^2)吧。
思想從第i個(i=0;i小於最後乙個元素的下標)元素開始,在它後面的序列中找到比第乙個元素小的數,用min記錄下最小元素的下標,每一趟結束後,判斷這個min對應的座標是不是i,如果不是就交換對應的資料,直到最後一趟。
實現
void select_sort(int
*arr,int len)
cout<<"select_sort"
min = 0;
int i = 0;
int j = 0;
for (;i< len-1;++i)
}if (min != i)
}}
效率
相比於氣泡排序,選擇排序的交換次數變少了,雖然它的比較次數和氣泡排序基本差不多,最好的情況是已經有序的序列,交換0次,最壞情況就交換n-1次,相比於氣泡排序是乙個很大的提公升。
穩定性選擇排序是個不穩定的演算法。在例如這樣的陣列中,在第一次交換的時候,第乙個5已經置於第二個5之後了,雖然這是乙個陣列,一組無關緊要的資料,但是在實際應用中,比如乙個搶票系統,在等待佇列中的使用者,因為資料的位置更改,會直接影響到結果的。
排序演算法 1 選擇排序演算法
這篇部落格分為兩個部分 選擇排序演算法基本思想 實現與解析 由於這個排序演算法比較簡單,因此這篇博文就不做過多解釋了 一.選擇排序演算法基本思想 1 選擇排序 小到大排序 1.遍歷所有未排序的元素 找到最小的那個元素 2.將這個元素與未排序序列的第乙個元素交換位置 3.當剩下乙個元素時 排序結束 o...
排序演算法 1 氣泡排序
氣泡排序是非常容易理解和實現,以從小到大排序舉例 設陣列長度為n。1 比較相鄰的前後二個資料,如果前面資料大於後面的資料,就將二個資料交換。2 這樣對陣列的第0個資料到n 1個資料進行一次遍歷後,最大的乙個資料就 沉 到陣列第n 1個位置。3 n n 1,如果n不為0就重複前面二步,否則排序完成。冒...
排序1 快速排序演算法
經典快排思路 1.首先設定乙個分界值,通過該分界值將陣列分為左右兩個部分。2.左邊部分是小於等於分界值的資料,右邊部分是大於分界值的資料。3.左邊和右邊遞迴呼叫方法 設定分界值,劃分左邊的是小於等於分界值的資料,右邊是大於分界值的資料。舉例 4,6,2,0,3 1.選取最右邊的3作為分界值,劃分後陣...