欧美一区2区三区4区公司二百,国产精品婷婷午夜在线观看,自拍偷拍亚洲精品,国产美女诱惑一区二区

數據結構之快速排序

一、快速排序

? ? 快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法,其基本思想為:任取待排序元素序列中的某元素作為基準值,按照該排序碼將待排序集合分割成兩子序列,左子序列中所有元素均小于基準值,右子序列中所有元素均大于基準值,然后最左右子序列重復該過程,直到所有元素都排列在相應位置上為止。

快排中心思想代碼演示:

// 假設按照升序對array數組中[left, right)區間中的元素進行排序
void QuickSort(int array[], int left, int right)
{
?if(right - left <= 1)
?return;
?
?// 按照基準值對array數組的 [left, right)區間中的元素進行劃分
?int div = partion(array, left, right);
?
?// 劃分成功后以div為邊界形成了左右兩部分 [left, div) 和 [div+1, right)
?// 遞歸排[left, div)
?QuickSort(array, left, div);
?
?// 遞歸排[div+1, right)
?QuickSort(array, div+1, right);
}

代碼實現:

// 三數取中
int GetMidi(int* a, int left, int right)
{
? ? int mid = (left + right) / 2;
? ? // left mid right
? ? if (a[left] < a[mid])
? ? {
? ? ? ? if (a[mid] < a[right])
? ? ? ? {
? ? ? ? ? ? return mid;
? ? ? ? }
? ? ? ? else if (a[left] > a[right]) ?// mid是最大值
? ? ? ? {
? ? ? ? ? ? return left;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? return right;
? ? ? ? }
? ? }
? ? else // a[left] > a[mid]
? ? {
? ? ? ? if (a[mid] > a[right])
? ? ? ? {
? ? ? ? ? ? return mid;
? ? ? ? }
? ? ? ? else if (a[left] < a[right]) // mid是最小
? ? ? ? {
? ? ? ? ? ? return left;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? return right;
? ? ? ? }
? ? }
}

//hoare
int PartSort1(int* a, int left, int right)
{
? ? int midi = GetMidi(a, left, right);
? ? Swap(&a[left], &a[midi]);

? ? int keyi = left;
? ? while (left < right)
? ? {
? ? ? ? // 找小
? ? ? ? while (left < right && a[right] >= a[keyi])
? ? ? ? {
? ? ? ? ? ? --right;
? ? ? ? }

? ? ? ? // 找大
? ? ? ? while (left < right && a[left] <= a[keyi])
? ? ? ? {
? ? ? ? ? ? ++left;
? ? ? ? }

? ? ? ? Swap(&a[left], &a[right]);
? ? }

? ? Swap(&a[keyi], &a[left]);
? ? return left;
};

代碼實現:

int PartSort2(int* a, int left, int right)
{
? ? int midi = GetMidi(a, left, right);
? ? Swap(&a[left], &a[midi]);

? ? int key = a[left];
? ? // 保存key值以后,左邊形成第一個坑
? ? int hole = left;

? ? while (left < right)
? ? {
? ? ? ? // 右邊先走,找小,填到左邊的坑,右邊形成新的坑位
? ? ? ? while (left < right && a[right] >= key)
? ? ? ? {
? ? ? ? ? ? --right;
? ? ? ? }
? ? ? ? a[hole] = a[right];
? ? ? ? hole = right;

? ? ? ? // 左邊再走,找大,填到右邊的坑,左邊形成新的坑位
? ? ? ? while (left < right && a[left] <= key)
? ? ? ? {
? ? ? ? ? ? ++left;
? ? ? ? }
? ? ? ? a[hole] = a[left];
? ? ? ? hole = left;
? ? }

? ? a[hole] = key;
? ? return hole;
}

代碼實現:

int PartSort3(int* a, int left, int right)
{
? ? int midi = GetMidi(a, left, right);
? ? Swap(&a[left], &a[midi]);

? ? int prev = left;
? ? int cur = prev + 1;

? ? int keyi = left;
? ? while (cur <= right)
? ? {
? ? ? ? if (a[cur] < a[keyi] && ++prev != cur)
? ? ? ? {
? ? ? ? ? ? Swap(&a[prev], &a[cur]);
? ? ? ? }

? ? ? ? ++cur;
? ? }

? ? Swap(&a[prev], &a[keyi]);
? ? return prev;
}

快速排序遞歸代碼:

void QuickSort(int* a, int begin, int end)
{
? ? if (begin >= end)
? ? ? ? return;

? ? int keyi = PartSort3(a, begin, end);//此處調用前后指針快排,也可調用其他兩種排序方法
? ? // [begin, keyi-1] keyi [keyi+1, end]
? ? QuickSort(a, begin, keyi - 1);
? ? QuickSort(a, keyi+1, end);
}

?

文章鏈接: http://www.qzkangyuan.com/27397.html

文章標題:數據結構之快速排序

文章版權:夢飛科技所發布的內容,部分為原創文章,轉載請注明來源,網絡轉載文章如有侵權請聯系我們!

聲明:本站所有文章,如無特殊說明或標注,均為本站原創發布。任何個人或組織,在未征得本站同意時,禁止復制、盜用、采集、發布本站內容到任何網站、書籍等各類媒體平臺。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。

給TA打賞
共{{data.count}}人
人已打賞
建站教程投稿分享

c語言之SJF

2024-1-29 13:16:21

建站教程

數據結構之快速排序優化

2024-2-19 11:19:37

0 條回復 A文章作者 M管理員
    暫無討論,說說你的看法吧
?
個人中心
購物車
優惠劵
今日簽到
有新私信 私信列表
搜索
主站蜘蛛池模板: 新丰县| 屯留县| 慈溪市| 喀喇| 苍梧县| 澄城县| 霸州市| 吴桥县| 稷山县| 靖远县| 沈丘县| 婺源县| 申扎县| 普宁市| 兴隆县| 弋阳县| 中江县| 迭部县| 衢州市| 新津县| 安塞县| 平陆县| 东丽区| 建德市| 平谷区| 太仓市| 达拉特旗| 安泽县| 探索| 海原县| 罗甸县| 绥阳县| 惠东县| 红安县| 溧水县| 丽水市| 金川县| 上虞市| 阿坝县| 米泉市| 开封市|