亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言中快速排序和插入排序優化的實現

2020-05-23 14:12:47
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C語言中快速排序和插入排序優化的實現,包括雙向劃分快速排序方法的介紹,需要的朋友可以參考下
 

快速排序
快速排序思想

    1962年,由C.A.R.Hoare創造出來。該算法核心思想就一句話:“排序數組時,將數組分成兩個小部分,然后對它們遞歸排序”。然而采取什么樣的策略將數組分成兩個部分是關鍵,想想看,如果隨便將數組A分成A1和A2兩個小部分,即便分別將A1和A2排好序,那么A1和A2重新組合成A時仍然是無序的。所以,我們可以在數組中找一個值,稱為key值,我們在把數組A分解為A1和A2前先對A做一些處理,讓小于key值的元素都移到其左邊,所有大于key值的元素都移到其右邊。這樣遞歸排序A1和A2,數組A就排好了。

舉例

    我們要排序的數組如下:

55 41 59 26 53 58 97 93

    我們選取第一個元素作為key值,即55.(一般都是選取第一個元素)。假如我們有一種辦法可以將數組做一步預處理,讓小于key值的元素都位于其左邊,大于key值的元素都位于其右邊,預處理完數組如下:

41 26 53 55 59 58 97 93 

    這樣數組就被key值劃分成了兩段,A[0...2]小于key,A[4...7]大于key,可見key值本身已排好序,接下來對A[0...2]和A[4...7]分別進行遞歸排序,那么整個數組就排好序了。預處理做的工作再次澄清下:找一個key值,把key位放到某位置A[p],使小于key值的元素都位于A[p]左邊,大于key值的元素都位于A[p]的右邊。到此,我們的快排模型就成型了。

/*l, u 代表待排序部分的下界和上界*/void qsort(l, u){ /*遞歸結束條件是待排序部分的元素個數小于2*/ if(l >= u) {  return; }  /*此處進行預處理,預處理后key值位于位置p*/  qsort(l, p-1); qsort(p+1, u);}

     接下來看如何做預處理。我們選取A[0]做為key值, p作為key值的位置。我們從A[1]開始遍歷后面的數組,用變量i指示目前的位置,每次找到小于key的值都與A[++p]交換。開始時p=0.

55 41 59 26 53 58 97 93 i = 1,A[i]位置為41, 即A[i] < key, swap(++p , i),即p = 1:
55 41 59 26 53 58 97 93 i = 2,A[i]位置為59,A[i] > key,不做任何改變。 
i = 3,A[i]位置為26,A[i] < key,swap(++p, i), 即p = 2:
55 41 26 59 53 58 97 93 i = 4,A[i]位置為53,A[i] < key,swap(++p, i),p = 3:
55 41 26 53 59 58 97 93 i = 5,A[i]位置為58,A[i] > key,不做任何改變。 
i = 6,A[i]位置為97,A[i] > key,不做任何改變. 
i = 7,A[i]位置為93,A[i] > key,不做任何改變.結束循環。此時p為key的最終位置。還需一步把key值填入p位置。
最后swap(l, p)即把Key值放到最終位置上了。至于為什么要交換l,p的位置,可以另拿一組數據試一下:55,41,59,26,99,58,97,93。

完整的程序1

/*l, u 代表待排序部分的下界和上界*/

void qsort(int l, int u){ /*遞歸結束條件是待排序部分的元素個數小于2*/ if(l >= u) {  return; }  int p = l; for(int i = l+1; i <= u; i++) {  if(A[i] < A[l])  {   swap(++p, i);  } } swap(l, p);  qsort(l, p-1); qsort(p+1, u);}

這就是第一代快速排序算法,正常情況下其復雜度為nlogn,但在考慮一種極端情況:n個相同元素組成的數組。在n-1次劃分中每次劃分都需要O(n)的時間,所以總的時間為O(n^2)。使用雙向劃分就可以避免這個問題。

雙向劃分快速排序

/*l, u 代表待排序部分的下界和上界*/void qsort(int l, int u){ /*遞歸結束條件是待排序部分的元素個數小于2*/ if(l >= u) {  return; }  key = A[l] for(int i = l, j = u+1; i <= j;) {  do i++ while(i <= u && A[i] < key));  do j-- while(A[j] > key);  if(i > j)  {   break;  }  swap(i, j); } swap(l, j);  qsort(l, j-1); qsort(j+1, u);}

插入排序優化
插入排序的精髓就是首先將第一個元素視為有序子數組x[0...0],然后插入x[1]...x[n-1].思想很簡單,代碼也很簡單,簡單的代碼有沒有優化的空間呢?編程珠璣中提供了幾個優化后的方案,效率提高了70%之多。

簡單的實現(sort1)

void insertSort(int *array, size_t size){ for(size_t i = 1; i < size; i++) {  for(int j = i; j > 0 && array[j - 1] > array[j]; j--)  {   swap(array[j - 1], array[j]);  } }}

優化思路
    內循環的swap函數可能不如內聯函數快些,所以第一步優化將該swap函數展開,據作者說,展開后效率提高了60%。

優化代碼(sort2)

void insertSort(int *array, size_t size){ for(size_t i = 1; i < size; i++) {  for(int j = i; j > 0 && array[j - 1] > array[j]; j--)  {   int t = array[j];   array[j] = array[j - 1];   array[j - 1] = t;  } }}

優化思路
    由于內循環中總是給變量t賦同樣的值(x[i]的初始值),所以內循環關于t的兩條賦值語句移出循環,據說這么做的效率又提高了15%。

優化代碼(sort3)

void insertSort(int *array, size_t size){ for(size_t i = 1; i < size; i++) {  int j = i;  int t = array[j];  for(; j > 0 && array[j - 1] > array[j]; j--)  {   array[j] = array[j - 1];  }  array[j] = t; }}

《編程珠璣》書中給出了三種排序的運行時間:

C語言中快速排序和插入排序優化的實現

插入排序的效率總是O(n2),效率差在比較的次數以及交換的頻率,如果交換的頻率減少的話就可以大大提高插入排序的效率,這也是為什么元素基本有序時插入排序效率高的原因。

個人觀點

    代碼調優以及性能優化都可能帶來一系列的副作用,比如程序的正確性,可讀性,可維護性等。是否需要調優要看問題性質,調優既是華而不實的“花活”,也是一把利刃,區別就在于使用的場合。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品免费观看| 91久久精品美女| 国产精品久久久av| 亚洲视频在线免费观看| 国外成人性视频| 亚洲成人久久一区| 日韩欧美精品在线观看| 欧美与欧洲交xxxx免费观看| 成人午夜黄色影院| 一区二区三区国产视频| 中日韩美女免费视频网址在线观看| 国产午夜精品免费一区二区三区| 久久亚洲精品国产亚洲老地址| 亚洲男人的天堂在线| 日韩视频精品在线| 欧美三级欧美成人高清www| 日韩电影中文字幕在线| 欧美精品在线免费观看| 久久久电影免费观看完整版| 91精品综合久久久久久五月天| 欧美日产国产成人免费图片| 久久亚洲综合国产精品99麻豆精品福利| 国产精品视频成人| 国产精品日韩电影| 欧美视频中文字幕在线| 国产日韩在线视频| 91国在线精品国内播放| 5566日本婷婷色中文字幕97| 久久国产精品久久久| 久久精品视频va| 欧美影院成年免费版| 亚洲欧美日韩直播| 91亚洲va在线va天堂va国| 欧洲s码亚洲m码精品一区| 国产99久久精品一区二区| 久久香蕉频线观| 国产98色在线| 日韩av在线免费播放| 国产日韩欧美中文在线播放| 亚洲免费视频网站| 日韩成人在线观看| 久热精品视频在线| 成人av资源在线播放| 欧美精品一本久久男人的天堂| 日韩精品在线看| 欧美大片va欧美在线播放| 亚洲18私人小影院| 成人免费直播live| 国产午夜精品全部视频在线播放| 成人午夜两性视频| 日韩欧美国产高清91| 欧美性生交xxxxxdddd| 久久久国产精品免费| 啪一啪鲁一鲁2019在线视频| 日韩欧美精品免费在线| 亚洲精品91美女久久久久久久| 日韩精品高清视频| 日韩中文在线中文网在线观看| 日韩成人中文字幕在线观看| 久热精品视频在线观看一区| 91精品国产综合久久香蕉的用户体验| 茄子视频成人在线| 精品女同一区二区三区在线播放| 日韩毛片在线观看| 欧美激情综合色综合啪啪五月| 亚洲人成毛片在线播放| 亚洲国产美女精品久久久久∴| 成人精品视频久久久久| 亚洲激情视频在线| 色婷婷av一区二区三区在线观看| 欧美天天综合色影久久精品| 久久精品国产成人| 欧美乱人伦中文字幕在线| 欧美精品电影在线| 亚洲夜晚福利在线观看| 国产精品亚洲美女av网站| 国产精品96久久久久久又黄又硬| 亚洲网站在线看| 色综合久久88色综合天天看泰| 久久伊人精品视频| 国产精品久久久久久久av电影| 亚洲精品98久久久久久中文字幕| 亚洲天堂第二页| 日韩免费av片在线观看| 视频在线观看99| 大荫蒂欧美视频另类xxxx| 日韩中文在线中文网三级| 亚洲国产天堂久久综合| 色哟哟网站入口亚洲精品| 国产精品第七十二页| 日韩av在线导航| 日韩专区中文字幕| 成人午夜高潮视频| 国产精品视频最多的网站| 日韩在线中文字| 亚洲性生活视频| 国产精品视频资源| 国产高清视频一区三区| 国产在线高清精品| 亚洲欧洲美洲在线综合| 精品激情国产视频| 成人精品久久av网站| 国产一区二区美女视频| 亚洲精品白浆高清久久久久久| 欧美日韩爱爱视频| 亚洲free嫩bbb| 国产精品久久久av| 亚洲欧美综合图区| 伊人一区二区三区久久精品| 国产99久久精品一区二区 夜夜躁日日躁| 国产欧美欧洲在线观看| 国产精品a久久久久久| 国产精品黄视频| 亚洲aaaaaa| 久久69精品久久久久久久电影好| 成人黄色午夜影院| 美日韩精品免费观看视频| 国产精品入口免费视频一| 欧美日韩国产色视频| 成人淫片在线看| 91超碰中文字幕久久精品| 欧美精品videossex性护士| 亚洲精品资源美女情侣酒店| 亚洲精品一区二区在线| 久99九色视频在线观看| 欧美午夜精品久久久久久人妖| 国产精品久久久久久久久借妻| 亚洲国产日韩欧美在线图片| 国产精品狠色婷| 国产精品精品久久久久久| 亚洲肉体裸体xxxx137| 92看片淫黄大片看国产片| 欧美性xxxx18| 日本久久久久久久| 国产91精品久久久久久久| 欧美性猛交xxxx乱大交蜜桃| 久久久久免费精品国产| 欧美视频在线观看 亚洲欧| 伊人精品在线观看| 69**夜色精品国产69乱| 欧美激情视频在线| 欧美国产亚洲精品久久久8v| 亚洲美女免费精品视频在线观看| 成人精品视频在线| 国产精品你懂得| 国产一区二区丝袜高跟鞋图片| 久久免费视频观看| 国产精品一区二区三区久久久| 97国产真实伦对白精彩视频8| 日韩国产欧美精品在线| 亚洲国产精品一区二区久| 日韩日本欧美亚洲| 国产亚洲欧美日韩美女| 成人久久久久久久| 国产免费一区视频观看免费| 国产精品视频最多的网站| 91a在线视频| 亚洲天堂开心观看| 久青草国产97香蕉在线视频| 国产美女直播视频一区| 欧美人成在线视频| 81精品国产乱码久久久久久| 国产精品网站入口| 国产亚洲a∨片在线观看|