亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語(yǔ)言中快速排序和插入排序優(yōu)化的實(shí)現(xiàn)

 更新時(shí)間:2015年11月24日 18:24:30   作者:戀戀美食  
這篇文章主要介紹了C語(yǔ)言中快速排序和插入排序優(yōu)化的實(shí)現(xiàn),包括雙向劃分快速排序方法的介紹,需要的朋友可以參考下

快速排序
快速排序思想

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

舉例

    我們要排序的數(shù)組如下:

55 41 59 26 53 58 97 93

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

41 26 53 55 59 58 97 93 

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

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

     接下來(lái)看如何做預(yù)處理。我們選取A[0]做為key值, p作為key值的位置。我們從A[1]開始遍歷后面的數(shù)組,用變量i指示目前的位置,每次找到小于key的值都與A[++p]交換。開始時(shí)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,不做任何改變.結(jié)束循環(huán)。此時(shí)p為key的最終位置。還需一步把key值填入p位置。
最后swap(l, p)即把Key值放到最終位置上了。至于為什么要交換l,p的位置,可以另拿一組數(shù)據(jù)試一下:55,41,59,26,99,58,97,93。

完整的程序1

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

void qsort(int l, int u)
{
 /*遞歸結(jié)束條件是待排序部分的元素個(gè)數(shù)小于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);
}

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

雙向劃分快速排序

/*l, u 代表待排序部分的下界和上界*/
void qsort(int l, int u)
{
 /*遞歸結(jié)束條件是待排序部分的元素個(gè)數(shù)小于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);
}

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

簡(jiǎn)單的實(shí)現(xiàn)(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]);
  }
 }
}

優(yōu)化思路
    內(nèi)循環(huán)的swap函數(shù)可能不如內(nèi)聯(lián)函數(shù)快些,所以第一步優(yōu)化將該swap函數(shù)展開,據(jù)作者說(shuō),展開后效率提高了60%。

優(yōu)化代碼(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;
  }
 }
}

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

優(yōu)化代碼(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;
 }
}

《編程珠璣》書中給出了三種排序的運(yùn)行時(shí)間:

20151124182333590.jpg (920×224)

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

個(gè)人觀點(diǎn)

    代碼調(diào)優(yōu)以及性能優(yōu)化都可能帶來(lái)一系列的副作用,比如程序的正確性,可讀性,可維護(hù)性等。是否需要調(diào)優(yōu)要看問(wèn)題性質(zhì),調(diào)優(yōu)既是華而不實(shí)的“花活”,也是一把利刃,區(qū)別就在于使用的場(chǎng)合。

相關(guān)文章

  • 結(jié)構(gòu)體類型數(shù)據(jù)作為函數(shù)參數(shù)(三種方法)

    結(jié)構(gòu)體類型數(shù)據(jù)作為函數(shù)參數(shù)(三種方法)

    將一個(gè)結(jié)構(gòu)體中變量中的數(shù)據(jù)傳遞給另一個(gè)函數(shù),有以下三種方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • c語(yǔ)言static關(guān)鍵字用法詳解

    c語(yǔ)言static關(guān)鍵字用法詳解

    大家好,本篇文章主要講的是c語(yǔ)言static關(guān)鍵字用法詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C++ Boost Phoenix庫(kù)示例分析使用

    C++ Boost Phoenix庫(kù)示例分析使用

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • C語(yǔ)言整形提升舉例詳解

    C語(yǔ)言整形提升舉例詳解

    對(duì)于整形提升,高位需要補(bǔ)位,那么補(bǔ)什么呢,無(wú)符號(hào)數(shù)高位補(bǔ)0,有符號(hào)數(shù)高位補(bǔ)1,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言整形提升的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Qt圖形圖像開發(fā)之曲線圖表庫(kù)QChart編譯安裝詳細(xì)方法與使用實(shí)例

    Qt圖形圖像開發(fā)之曲線圖表庫(kù)QChart編譯安裝詳細(xì)方法與使用實(shí)例

    這篇文章主要介紹了Qt圖形圖像開發(fā)之曲線圖表庫(kù)QChart編譯安裝詳細(xì)方法與使用實(shí)例,需要的朋友可以參考下
    2020-03-03
  • C++ 多態(tài)性虛函數(shù)和動(dòng)態(tài)綁定學(xué)習(xí)筆記

    C++ 多態(tài)性虛函數(shù)和動(dòng)態(tài)綁定學(xué)習(xí)筆記

    這篇文章主要為大家介紹了C++ 多態(tài)性虛函數(shù)和動(dòng)態(tài)綁定學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • C++ 位圖及位圖的實(shí)現(xiàn)原理

    C++ 位圖及位圖的實(shí)現(xiàn)原理

    位圖實(shí)際上就是一個(gè)數(shù)組,因?yàn)閿?shù)組有隨機(jī)訪問(wèn)的功能,比較方便查找,這個(gè)數(shù)組一般是整形,今天通過(guò)本文給大家分享c++位圖的實(shí)現(xiàn)原理及實(shí)現(xiàn)代碼,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • C語(yǔ)言數(shù)組任意位置插入一個(gè)元素方法

    C語(yǔ)言數(shù)組任意位置插入一個(gè)元素方法

    這篇文章主要給大家分享C語(yǔ)言數(shù)組任意位置插入一個(gè)元素方法,
    2021-11-11
  • C語(yǔ)言中的數(shù)據(jù)類型詳解

    C語(yǔ)言中的數(shù)據(jù)類型詳解

    在C語(yǔ)言中,數(shù)據(jù)類型指的是用于聲明不同類型的變量或函數(shù)的一個(gè)廣泛的系統(tǒng)。變量的類型決定了變量存儲(chǔ)占用的空間,以及如何解釋存儲(chǔ)的位模式,本文將詳細(xì)給大家介紹一下C語(yǔ)言中的基本數(shù)據(jù)類型,感興趣的同學(xué)可以參考下
    2023-05-05
  • 深入講解C++中的構(gòu)造函數(shù)

    深入講解C++中的構(gòu)造函數(shù)

    這篇文章主要介紹了C++中的構(gòu)造函數(shù),是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09

最新評(píng)論