青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

SoRoMan

人若無名,便可專心練劍.

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  12 隨筆 :: 1 文章 :: 41 評論 :: 0 Trackbacks

//
// File: [TestSort.cpp]
// Description:[This file illustrate the sort methods. Make sure the length of the sequence consistent with its contents!]?
// Author:[SoRoMan]
// Date:[07/31/2006]
// Version:[1.0]
// History: []
//?

// INCLUDES ///////////////////////////////////////////////
#include "stdio.h"

// DEFINES ////////////////////////////////////////////////
#define N 11

// PROTOTYPES /////////////////////////////////////////////
void QuickSort(int *seq, int lenght);
void InsertSort(int *seq, int lenght);
void InsertSort2(int *seq, int lenght);
void ShellSort(int *seq, int lenght);
void IncrementInsertSort(int *seq, int length, int increment);
void HeapSort(int *seq, int length);
void SelectionSort(int *seq, int length);
void BubbleSort(int *seq, int length);
void BiBubbleSort(int *seq, int length);
void AdjustHeap(int *seq, int startIndex, int endIndex);

// GLOBALS ////////////////////////////////////////////////
int nAssignmentOperation = 0; // assignment counter
int nComparsionOperation = 0; // comparsion counter

// FUNCTIONS //////////////////////////////////////////////

int main(int argc, char* argv[])
{
?printf("0: Original Sequence\n");
?printf("1: Quick Sort\n");
?printf("2: Insert Sort\n");
?printf("3: Shell Sort\n");
?printf("4: Insert Sort2\n");
?printf("5: Heap Sort\n");
?printf("6: Selection Sort\n");
?printf("7: Bubble Sort\n");
?printf("8: Bi-Bubble Sort\n");
?printf("-1: Exit\n");?

?int cat = 0;?
?while (cat != -1)
?{
??// clear counter
??nAssignmentOperation = 0;
??nComparsionOperation = 0;

??//int array[N] = {600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,
??//600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1,600, 64,6,78,246,445,345,445,7,4885,1};
??int array[N] = {600, 64,6,78,246,445,345,445,7745,4885,1};

??printf("\nPlease select sort method:");
??scanf("%d", &cat);
??printf("-------------------------------------------------\n");

??switch(cat)
??{
???case 0:printf("No Sort. The Original Sequence is\n");
????break;
???case 1:printf("Quick Sort\n"); QuickSort(array, N);
????break;
???case 2:printf("Insert Sort\n"); InsertSort(array, N);
????break;
???case 3:printf("Shell Sort\n"); ShellSort(array, N);
????break;
???case 4:printf("Insert Sort2\n"); InsertSort2(array, N);
????break;
???case 5:printf("Heap Sort\n"); HeapSort(array, N);
????break;
???case 6:printf("Selection Sort\n"); SelectionSort(array, N);
????break;
???case 7:printf("Bubble Sort\n"); BubbleSort(array, N);
????break;
???case 8:printf("Bi-Bubble Sort\n"); BiBubbleSort(array, N);
????break;
???default:printf("Exit...\n");
????return 0;
??}

??for(int i = 0; i < N; i++)
??{
???printf("int = %d\n", array[i]);
??}

??printf("Count of comparsion operation? = %d\n", nComparsionOperation);
??printf("Count of assignment operation? = %d\n", nAssignmentOperation);
??printf("-------------------------------------------------\n");
?}

?return 0;
}

inline void Swap(int *pCurrPost, int *pCurrKey)
{
?nAssignmentOperation += 3;
?int temp;

?//swap value
?temp = *pCurrPost;
?*pCurrPost = *pCurrKey;
?*pCurrKey = temp;
}

////////////////////////////////////////////////////////////////////////////////
// Quick Sort algorithm.? (By SoRoMan, 2006.7.31)
// 快速排序的基本思想是基于分治策略的。對于輸入的子序列L[p..r],如果規模足夠小則直接進行排序(比如用前述的冒泡、選擇、插入排序均可),否則分三步處理:
// 1.分解(Divide):將待排序列L[p..r]劃分為兩個非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。具體可通過這樣的途徑實現:在序列L[p..r]中選擇數據元素L[q],經比較和移動后,L[q]將處于L[p..r]中間的適當位置,使得數據元素L[q]的值小于L[q+1..r]中任一元素的值。
// 2.遞歸求解(Conquer):通過遞歸調用快速排序算法,分別對L[p..q]和L[q+1..r]進行排序。
// 3.合并(Merge):由于對分解出的兩個子序列的排序是就地進行的,所以在L[p..q]和L[q+1..r]都排好序后不需要執行任何計算L[p..r]就已排好序,即自然合并。
// 這個解決流程是符合分治法的基本步驟的。因此,快速排序法是分治法的經典應用實例之一。
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void QuickSort(int *seq, int length)
{
?if(length <= 1)
?{
??return;
?}
?else
?{
??int post = *seq; // set post
??int *pCurrPost = seq; // set current position of post
??int *pCurrKey; // current position of key

??for(int j = length - 1, i = 1; i <= j;)
??{
???// handle the right sub-sequence
???while(i <= j)
???{
????pCurrKey = seq + j;

????if(*pCurrKey < post)
????{
?????Swap(pCurrPost, pCurrKey);
?????pCurrPost = pCurrKey;

?????break;
????}
????else
????{
?????j--;
????}

????nComparsionOperation ++;
???}

???// handle the left sub-sequence
???while(i <= j)
???{
????pCurrKey = seq + i;

????if(*pCurrKey > post)
????{
?????Swap(pCurrPost, pCurrKey);
?????pCurrPost = pCurrKey;

?????break;
????}
????else
????{
?????i++;
????}

????nComparsionOperation ++;
???}
??}
??// handle two sub sequences recursively
??int lleng = pCurrPost - seq; // left sub sequence
??int rleng = length - lleng - 1; // right sub sequence
??QuickSort(seq, lleng);
??QuickSort(seq + lleng + 1, rleng);
?}
}


////////////////////////////////////////////////////////////////////////////////
// Insert Sort algorithm (A special increment insert sort, increment = 1).? (By SoRoMan, 2006.7.31)
//插入排序的基本思想是,經過i-1遍處理后,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L[1..i-1]的適當位置,使得L[1..i]又是排好序的序列。要達到這個目的,我們可以用順序比較的方法。首先比較L[i]和L[i-1],如果L[i-1]≤ L[i],則L[1..i]已排好序,第i遍處理就結束了;否則交換L[i]與L[i-1]的位置,繼續比較L[i-1]和L[i-2],直到找到某一個位置j(1≤j≤i-1),使得L[j] ≤L[j+1]時為止。
//簡言之,插入排序就是每一步都將一個待排數據按其大小插入到已經排序的數據中的適當位置,直到全部插入完畢。插入排序方法分直接插入排序和折半插入排序兩種,這里只介紹直接插入排序,折半插入排序留到“查找”內容中進行
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void InsertSort(int *seq, int length)
{
?IncrementInsertSort(seq, length, 1);
}

void InsertSort2(int *seq, int length)
{
?for(int i = 1; i < length; i++)
?{
??for (int j = 0; j < i; j++)
??{
???if(*(seq + i) < *(seq + j))
???{?
????int temp = *(seq + i);
????nAssignmentOperation ++;

????// insert, move (i-j) items
????for(int k = i; k > j; k-- )
????{
?????*(seq + k) = *(seq + k - 1);
?????nAssignmentOperation ++;
????}

????*(seq + k) = temp;
????nAssignmentOperation ++;

????nComparsionOperation ++;

????break;
???}
??}
?}
}

void IncrementInsertSort(int *seq, int length, int increment)
{
?for(int k = 0; k < increment; k++)
?{
??for (int i = increment + k; i < length; i+=increment + k)
??{
???int temp = *(seq + i);
???for (int j = i; j > increment - 1;)
???{
????nComparsionOperation ++;

????if(temp > *(seq + j - increment))
????{????
?????*(seq + j) = *(seq + j - increment);
?????nAssignmentOperation ++;
?????j-=increment;
????}
????else
????{
?????break;
????}
???}

???*(seq + j) = temp;
???nAssignmentOperation ++;????
??}
?}?
}

////////////////////////////////////////////////////////////////////////////////
// Shell Sort algorithm (Increment insert sort, increment = increment/3 + 1.).? (By SoRoMan, 2006.7.31)
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void ShellSort(int *seq, int length)
{
?for(int increment = length; increment > 1;)
?{
??increment = increment/3 + 1;
??IncrementInsertSort(seq, length, increment);
?}
}


////////////////////////////////////////////////////////////////////////////////
// Heap Sort algorithm.? (SoRoMan, 2006.7.31)
//
//1.堆的概念:
//堆是一個關鍵字序列{k1,k2,…,kn},它具有如下特性:
//ki ≤k2i, ki ≤ k2i+1
//或ki ≥ k2i,ki ≥ k2i+1(i=1,2,…, └n/2┘)
//堆的特性在完全二叉樹中解釋為:完全二叉樹中任一結點的關鍵字都小于等于(或大于等于)它的左右孩子的關鍵字。
//如下列關鍵字序列均是堆: {5,23,16,68,94,72,71,73} (小頂堆) {96,83,27,38,11,9} (大頂堆) 由堆的定義可知:若關鍵字序列{k1,k2,…,kn}是堆,則堆頂元素是n個元素序列中的最小(或最大)元素。

//2.基本思想:
//首先將初始待排序記錄序列建堆,則堆頂元素必為含最大關鍵字或最小關鍵字的記錄,輸出該記錄,然后將剩余記錄再調整為堆,如此反復,直至排序結束。
//在堆排序主要需解決兩個問題:
//① 如何建堆? 在完全二叉樹中,所有序號i>└n/2┘的結點都是葉子,因此,以這些結點為根的子樹均已是堆,這樣只需將以序號為└n/2┘, └n/2┘-1, └n/2┘-2,…,1的結點為根、的子樹都調整為堆即可。在按此次序調整每個結點時,其左、右子樹均已是堆。
//② 若ki的左、右子樹已經是堆,如何將以ki為根的完全二叉樹也調整為堆? 因ki的左、右子樹已經是堆,所以必須在ki 和它的左、右孩子中選出最小(或最大)的結點放到ki的位置上,不妨設k2I關鍵字最小,將ki與k2I交換位置,而交換之后有可能導致以k2I為根的子樹不再為堆,于是可重復上述過程,將以k2I為根的子樹調整為堆,……,如此逐層下去,最多可能一直調整到樹葉,此方法稱為"篩選法"。

//3.性能分析:
//堆排序的時間主要由建立初始堆和不斷重復建堆這兩部分的時間開銷構成。其中:建立初始堆時,總共需進行的關鍵字比較次數 ≤ 4n =O(n) ;排序過程中進行n-1次重建堆所進行的總比較次數不超過下式: 2*(└ log2(n-1) ┘+└ log2(n-2) ┘+…+ └ log22 ┘) < 2n └ log2n ┘=O(n log2n)因此堆排序總的時間復雜度是 O(n+ n log2n)= O(n log2n)。
//堆排序在最壞情況下的時間復雜度也是O(nlog2n),相對于快速排序來說,這是堆排序的最大優點。
//另外,堆排序僅需一個記錄大小供交換用的輔助空間。由于建初始堆所需的比較次數較多,所以堆排序不適宜于記錄較少的文件,但對n較大的文件還是很有效的。
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void HeapSort(int *seq, int length)
{
?for(int n = length; n > 0; n--)
?{
??for(int j = n/2; j > 0; j--)
??{
???AdjustHeap(seq, j, n);
??}

??Swap(seq, seq+n-1);??
?}?
}

void AdjustHeap(int *seq, int startIndex, int endIndex)
{
?while(2*startIndex <= endIndex)
?{
??int i =? startIndex - 1;
??startIndex = startIndex*2;

??nComparsionOperation ++;
??if (startIndex < endIndex && *(seq + startIndex -1) < *(seq + startIndex))
??{
???startIndex++;
??}

??nComparsionOperation ++;
??if(*(seq + startIndex -1) > *(seq + i))
??{
???Swap(seq + startIndex - 1, seq + i);
??}??
??else
??{
???break;
??}
?}
}

////////////////////////////////////////////////////////////////////////////////
// Selection Sort algorithm.? (SoRoMan, 2006.7.31)
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void SelectionSort(int *seq, int length)
{
?for(int i = 0; i < length; i++)
?{
??int k = i;
??for(int j = i+1; j < length; j++)
??{
???nComparsionOperation ++;
???if (*(seq + j) < *(seq + k))
???{
????k = j;
???}
??}

??Swap(seq + k, seq + i);
?}
}

////////////////////////////////////////////////////////////////////////////////
// Bubble Sort algorithm.? (SoRoMan, 2006.7.31)
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void BubbleSort(int *seq, int length)
{
?for(int i = 0; i < length; i++)
?{
??for(int j = length-1; j > i; j--)
??{
???nComparsionOperation ++;
???if (*(seq + j) < *(seq + j - 1))
???{
????Swap(seq + j, seq + j - 1);
???}
??}
?}
}

////////////////////////////////////////////////////////////////////////////////
// Bi-Directinal Bubble Sort algorithm.? (SoRoMan, 2006.7.31)
//思想:
//基于在一趟排序中,位于最后一次交換關鍵字的的后面的關鍵字序列已經是有序的,所以不用再排序。
//相對于一般的冒泡排序,可以減少關鍵字比較次數,但交換次數不變。
// Input Parameters: seq: pointer variable that identifies which sequence will be sorted.
// length: int that identifies the length of the sequence.
// Output Parameters: None.
// Return: None.
////////////////////////////////////////////////////////////////////////////////
void BiBubbleSort(int *seq, int length)
{
?int k,low,up;
?low = 0;
?up = length-1;
?while (up > low)
?{
??k = low;??

??for(int i = low; i < up; i++)
??{
???nComparsionOperation ++;
???if (*(seq + i) > *(seq + i + 1))
???{
????Swap(seq + i, seq + i + 1);

????k = i;
???}
??}

??up = k;

??for(int j = up; j > low; j--)
??{
???nComparsionOperation ++;
???if (*(seq + j) < *(seq + j - 1))
???{
????Swap(seq + j, seq + j - 1);

????k = j;
???}
??}?

??low = k;
?}

}

?

?


?

posted on 2006-07-31 15:14 SoRoMan 閱讀(1255) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费成人在线观看视频| 野花国产精品入口| 欧美专区在线观看| 亚洲一区激情| 亚洲一区二区三区在线播放| 亚洲美女淫视频| 亚洲人屁股眼子交8| 亚洲观看高清完整版在线观看| 麻豆精品视频在线观看| 开心色5月久久精品| 欧美国内亚洲| 亚洲日本一区二区| 亚洲一区二区三区久久| 欧美一级久久久| 欧美成人精品不卡视频在线观看| 久久亚洲捆绑美女| 欧美日本国产| 国产日产欧产精品推荐色 | 国产亚洲欧洲一区高清在线观看 | 亚洲精品免费观看| 亚洲欧美日韩精品久久亚洲区| 午夜精品亚洲一区二区三区嫩草| 久久免费视频观看| 久久成人精品一区二区三区| 夜夜精品视频一区二区| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲国产欧美另类丝袜| 99re66热这里只有精品4| 亚洲中无吗在线| 久久亚洲高清| 99在线视频精品| 久久精品一区蜜桃臀影院| 欧美日韩a区| 亚洲欧洲一区二区天堂久久 | 午夜欧美精品久久久久久久| 久久精品二区三区| 亚洲欧洲中文日韩久久av乱码| 亚洲视频中文字幕| 免费在线观看精品| 国产欧美一二三区| 中文国产亚洲喷潮| 老司机aⅴ在线精品导航| 日韩视频欧美视频| 男人的天堂成人在线| 国产丝袜一区二区| 亚洲视频一区二区免费在线观看| 久久综合九色九九| 亚洲欧美精品中文字幕在线| 欧美精品一区二| 在线国产亚洲欧美| 久久精品五月| 亚洲制服少妇| 欧美三区在线视频| 日韩写真视频在线观看| 欧美 日韩 国产 一区| 香蕉亚洲视频| 国产精品乱子久久久久| 一区二区三区偷拍| 日韩视频永久免费观看| 欧美电影免费观看高清完整版| 国语对白精品一区二区| 久久电影一区| 午夜电影亚洲| 国产无一区二区| 欧美一级久久| 亚洲欧美日韩久久精品| 国产亚洲精品bt天堂精选| 狠狠干成人综合网| 欧美一级片一区| 国产精品99久久久久久久久久久久| 免费亚洲一区二区| 亚洲国产毛片完整版 | 蜜桃久久av| 亚洲乱亚洲高清| 欧美 日韩 国产 一区| 在线欧美一区| 巨乳诱惑日韩免费av| 久久久精品久久久久| 精品999在线观看| 久久婷婷综合激情| 久久久7777| 亚洲电影第1页| 欧美福利在线| 欧美日韩和欧美的一区二区| 亚洲伊人网站| 欧美在线免费一级片| 国外成人网址| 欧美激情一区二区三区高清视频| 免费日韩一区二区| 亚洲伊人一本大道中文字幕| 亚洲一区二区黄| 国内精品视频在线播放| 亚洲二区在线视频| 欧美性理论片在线观看片免费| 先锋影音国产精品| 开心色5月久久精品| 亚洲美女视频| 亚洲精品国产精品久久清纯直播| 看片网站欧美日韩| 欧美乱大交xxxxx| 午夜激情一区| 久久久蜜臀国产一区二区| 亚洲久久一区二区| 亚洲午夜视频在线| 伊人色综合久久天天五月婷| 日韩性生活视频| 国产专区一区| 一级日韩一区在线观看| 一区二区三区在线视频播放| 亚洲精品在线看| 国产综合一区二区| 一区二区电影免费在线观看| 国产综合视频| 一区二区三区高清在线观看| 在线观看不卡| 亚洲视频国产视频| 亚洲精品日产精品乱码不卡| 亚洲欧美一区二区原创| 一本久久知道综合久久| 久久精品女人天堂| 亚洲免费一区二区| 久久视频在线免费观看| 亚洲裸体在线观看| 国外成人在线| 一区二区三区欧美在线观看| 亚洲国产成人精品女人久久久| 亚洲天堂免费观看| 亚洲伦理在线免费看| 欧美一区二区视频观看视频| 亚洲一区二区三区在线观看视频| 久久在线精品| 久久久97精品| 国产精品极品美女粉嫩高清在线 | 欧美大片在线观看一区二区| 久久精品首页| 国产日产精品一区二区三区四区的观看方式 | 在线播放豆国产99亚洲| 一二三区精品福利视频| 日韩一级大片| 男人的天堂成人在线| 蜜桃精品一区二区三区| 一区在线观看视频| 欧美在线观看视频一区二区三区| 亚洲宅男天堂在线观看无病毒| 欧美精品三级在线观看| 亚洲精品中文字幕在线| 一本色道久久综合亚洲精品小说| 欧美国产精品劲爆| 91久久精品一区二区别| 99精品国产福利在线观看免费 | 亚洲美女在线视频| 一区二区三区高清不卡| 欧美性久久久| 香蕉久久国产| 久久婷婷国产综合精品青草| 欧美国产日韩一区二区三区| 国产一区二区三区自拍| 中文精品视频| 午夜国产精品视频免费体验区| 国产精品久久久999| 一区二区高清在线观看| 午夜精品久久久久久久蜜桃app | 亚洲一区二区三区四区五区黄| 午夜国产精品视频免费体验区| 国产欧美亚洲一区| 久久免费99精品久久久久久| 欧美激情1区2区3区| 一区二区三区视频在线看| 国产精品日产欧美久久久久| 午夜精品福利在线观看| 欧美国产先锋| 亚洲深夜影院| 国产一区二区在线观看免费播放| 久久久久久9| 日韩系列在线| 久久精品九九| 亚洲毛片在线观看| 国产欧美一区二区三区久久人妖| 久久―日本道色综合久久| 亚洲日本免费| 久久精品夜色噜噜亚洲aⅴ| 亚洲人成小说网站色在线| 国产精品www994| 鲁大师影院一区二区三区| av不卡在线| 美女国产精品| 午夜国产精品影院在线观看| 亚洲欧洲精品一区二区三区 | 欧美成人一区在线| 亚洲欧美日本视频在线观看| 在线观看日韩www视频免费| 欧美日韩一区二区三区高清| 久久日韩精品| 性久久久久久久久久久久| 亚洲人成亚洲人成在线观看图片 | 亚洲区一区二区三区| 久久精品中文字幕一区| 亚洲香蕉在线观看| 亚洲人成77777在线观看网| 国产丝袜美腿一区二区三区|