排序算法
来源:互联网 发布:传奇霸业龙脉各阶数据 编辑:程序博客网 时间:2024/05/20 15:10
A、插入排序
一、直接插入排序
void InsertSort(SqList &L)
{
for (i=2; i<L.length; i++)
{
if (L.r[i].key < L.r[i-1].key)
{
L.r[0] = L.r[i];
for (j=i; L.r[0].key<L.r[j-1].key; j--)
{
L.r[j] = L.r[j-1];
}
L.r[j] = L.r[0];
}
}
}
二、折半插入排序
void BInsertSort(SqList &L)
{
for (i=2; i<=L.length; i++)
{
if (L.r[i].key < L.r[i-1].key)
{
L.r[0] = L.r[i];
low = 1;
high = i-1;
while (low <= high)
{
middle = (low+high)/2;
if (L.r[0] < middle)
{
high = middle - 1;
}
else
{
low = middle + 1;
}
}
for (j=i; j>high+1; j--)
{
L.r[j] = L.r[j-1];
}
L.r[high+1] = L.r[0];
}
}
}
三、2路插入排序
/*
* FileName: bidir_insertion_sort.c
* Author: Antigloss at http://stdcpp.cn
* LastModifiedDate: 2005-11-12 12:00
* Purpose: Bidirection Insertion Sort
*/
#include <stdio.h>
#include <stddef.h>
#define ARR_SIZE 10
/* 函数原型 */
void bidir_insert( int keys[], int temp[], const size_t i );
int main(void)
{
size_t i;
int keys[ARR_SIZE] = { 1050, 100, 150, 20, 9000, 5110, 3008, 1450, 5220, 500 };
int temp[ARR_SIZE]; /* 辅助数组 */
/* 进行二路插入排序 */
bidir_insert(keys, temp, ARR_SIZE);
/* 输出排序结果 */
for ( i = 0; i < ARR_SIZE; ++i ) {
printf("%d ", keys[i]);
}
printf("/nPress ENTER to quit.../n");
getchar();
return 0;
}
/* Begin of bidir_insert 05-11-12 12:00 */
void bidir_insert( int keys[], int temp[], const size_t arr_size )
{
size_t i, first, final;
final = first = 0;
temp[0] = keys[0]; /* 将第一个元素放入辅助数组 */
/* 利用辅助数组 temp 进行二路插入排序 */
for ( i = 1; i < arr_size; ++i )
{
if ( temp[final] <= keys[i] )
{
temp[++final] = keys[i];
}
else if ( keys[i] <= temp[first] )
{
first = (first - 1 + arr_size) % arr_size;
temp[first] = keys[i];
}
else
{
size_t index;
for ( index = (final - 1 + arr_size) % arr_size; ;
index = (index - 1 + arr_size) % arr_size )
{
if ( temp[index] <= keys[i] )
{
size_t mid = final++;
/* 元素后移 */
while ( mid != index )
{
temp[(mid + 1) % arr_size] = temp[mid];
mid = (mid - 1 + arr_size) % arr_size;
}
temp[(index + 1) % arr_size] = keys[i];
break;
}
}
}
}
/* 将 temp 的内容按顺序复制到 keys 中 */
for ( i = 0; i < arr_size; ++i ) {
keys[i] = temp[first];
first = (first + 1) % arr_size;
}
} /* End of bidir_insert */
四、表插入排序
#define SIZE 100
struct SLNode;
typedef struct{
RcdType rc;
int next;
}SLNode;
typedef struct{
SLNode r[SIZE];
int length;
}SLinkListType;
void ListInsertSort(SLinkListType &L)
{
L.r[0].rc = MAXINT;
L.r[0].next = 1;
L.r[1].next = 0;
for (i=2; i<=L.length; i++)
{
int p = 0;
int q = L.r[0].next;
while ( L.r[i].rc > L.r[q].rc )
{
p = q;
q = L.r[q].next;
}
L.r[p].next = i;
L.r[i].next = q;
}
}
void Arrage(SLinkListType &SL)
{
p = SL.r[0].next;
for (i=1; i<SL.length; i++)
{
while (p<i)
{
p = SL.r[p].next;
}
q = SL.r[p].next;
if (p != i)
{
SL.r[i] <-> SL.r[p];
SL.r[i].next = p;
}
p = q;
}
}
五、shell排序
void ShellInsert(SqList &L, int dk)
{
for (i=dk+1; i<=L.length; i++)
{
if (L.r[i].key < L.r[i-dk].key)
{
L.r[0] = L.r[i];
for (j=i-dk; j>0 && L.r[0].key<L.r[j].key; j-=dk )
{
L.r[j+dk] = L.r[j];
}
L.r[j+dk] = L.r[0];
}
}
}
void ShellSort(SqList &L, int dlta[], int t)
{
for (k=0; k<t; t++)
ShellInsert(L, dlta[k]);
}
B、快速排序
一、起泡排序
void BubbleSort(SqList &L)
{
for (i=L.length, change=TRUE; i>=2 && change; i--)
{
change = FALSE;
for (j=1; j<i; j++)
{
if (L.r[j]>L.r[j+1])
{
L.r[j] <-> L.r[j+1]
change = TRUE;
}
}
}
}
二、快速排序
int Partition(SqList &L, int low, int high)
{
L.r[0] = L.r[low];
pivotkey = L.r[low].key;
while (low<high)
{
while (low<high && L.r[high].key >= pivotkey) --high;
L.r[low] = L.r[high];
while (low<high && L.r[low].key <= pivotkey) ++low;
L.r[high] = L.r[low];
}
L.r[low] = L.r[0];
return low;
}
void QSort(SqList &L, int low, int high)
{
if (low < high)
{
pivotLoc = Partition(L, low, high);
QSort(L, low, pivotLoc-1);
QSort(L, pivotLoc+1, high);
}
}
void QuickSort(SqList &L)
{
QSort(L, 1, L.length);
}
C、选择排序
一、简单选择排序
void SelectSort(SqList &L)
{
for (i=1; i<L.length; ++i)
{
j = SelectMinKey(L, i);
if (i != j)
{
L.r[i]<->L.r[j];
}
}
}
二、树形选择排序(锦标赛排序)
typedef SqList HeapType; //堆采用顺序表存储表示
void HeapAdjust(HeapType &H, int s, int m)
{
//已知H.r[s..m]中记录的关键字除H.r[s].key之外满足堆的定义,本函数调整H.r[s]
//的关键字,使H.r[s..m]成为一个大顶堆(对其中记录的关键字而言)
rc = H.r[s];
for (j=2*s; j<=m; j*=2)
{
if (j<m && H.r[j].key <= H.r[j+1].key)
++j; //j为key较大的记录的下标
if (!(rc.key <= H.r[j].key))
break;
H.r[s] = H.r[j];
s = j;
}
H.r[s] = rc;
}
void HeapSort(HeapType &H)
{
//对顺序表H进行堆排序
for (i=H.length/2; i>0; --i) //把H.r[1..H.length]建成大顶堆
HeapAdjust(H, i, H.length);
for (i=H.length; i>1; --i)
{
H.r[1]<->H.r[i]; //将堆顶记录和当前未经排序子序列H.r[1..i]中
//最后一个记录相互交换
HeapAdjust(H, 1, i-1); //将H.r[1..i-1]重新调整为大顶堆
}
}
Merging Sort
void Merge(RcdType SR[], RcdType &TR[], int i, int m, int n)
{
//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]
for (j=m+1, k=i; i<=m && j<=n; ++k)
{
if (SR[i].key <= SR[j].key)
{
TR[k] = SR[i++];
}
else
{
TR[k] = SR[j++];
}
}
if (i <= m)
{
TR[k..n] = SR[i..m]; //将剩余的SR[i..m]复制到TR
}
if (j <= n)
{
TR[k..n] = SR[j..n]; //将剩余的SR[j..n]复制到TR
}
}//Merge
void MSort(RcdType SR[], RcdType &TR1[], int s, int t)
{
//将SR[s..t]归并排序为TR1[s..t].
if (s == t)
{
TR1[s] = SR[s];
}
else
{
m = (s + t)/2; //将SR[s..t]平分为SR[s..m]和SR[m+1..t]
MSort(SR, TR2, s, m); //递归地将SR[s..m]归并为有序的TR2[s..m]
MSort(SR, TR2, m+1, t); //递归地将SR[m+1..t]归并为有序的TR2[m+1..t]
Merge(TR2, TR1, s, m, t); //将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t]
}
}//MSort
void MergeSort(SqList &L)
{
MSort(L.r, L,r, 1, );
}
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 鼓励自己---大将在后阵
- Adding 301 redirects using htaccess
- js offsetHeight offsetWidth 解说
- 水晶报表中如何动态加载图片
- oracle的笔记,凑合着看吧!8.分页以及rownum
- 排序算法
- "没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"?
- 开篇!
- 英文--感谢用语
- static 函数和变量
- 希赛,我喜欢
- 星烛网--专业的WEB应用供应商
- 《DB2新手入门》资料
- C/C++内存分配学习