# 排序

208人阅读 评论(0)

1.直接插入排序

<span style="font-size:18px;">void InsertSort(int *a,int length)
{
for (int i = 0; i < length-1; i++)
{
int end = i;
int tmp = a[end + 1];
while (end>=0&&tmp < a[end])
{
a[end + 1] = a[end];
end--;
}
a[end + 1] = tmp;
}
}</span>

...
2.希尔排序

void ShellSort(int *a,int length)
{
assert(a);
int gap = length;
while (gap > 1)
{
gap = gap / 3 + 1;//慢慢缩小范围直到缩小到1
for (int i = 0; i < length-gap; i++)
{
int end = i;
int tmp = a[end + gap];
while (a[end]>tmp&&end>=0)
{
a[end + gap] = a[end];
end -= gap;
}
a[end + gap] = tmp;
}
}
}

1.直接选择排序

void SelectSort(int *a,int length)
{

int end = length - 1;
for (; end > 0; end--)
{
int MaxIndex = 0;
for (int i = 0; i <= end; i++)//选出最大值的下标
{
if (a[MaxIndex] < a[i])
MaxIndex = i;
}
swap(a[end], a[MaxIndex]);//交换到相对最后的位置
}
}

……

-->优化

void SelectSort(int *a, int length)
{
assert(a);
assert(length > 0);

int end = length - 1;
int start = 0;
while (end > start)
{
int iMax = start;
int iMin = start;
for (int i = start+1; i <= end; i++)
{
if (a[i] >= a[iMax])
iMax = i;
if (a[i] < a[iMin])
iMin = i;
}
if ((start != iMax)&&(end != iMin))//情况1
{
swap(a[start], a[iMin]);
swap(a[end], a[iMax]);
}
if ((start == iMax)&&(end == iMin))//情况2
{
swap(a[iMax], a[iMin]);
}
if ((start == iMax)&&(end != iMin))//情况3
{
swap(a[iMax], a[end]);
swap(a[iMin], a[start]);
}
if ((start != iMax) && (end == iMin))//情况4
{
swap(a[iMin], a[start]);
swap(a[iMax], a[end]);
}
start++;
end--;

}
}

……

2.堆排序

void _AdjustDown(int *a, int size, int parent)//向下调整
{
int child = parent * 2 + 1;
while (child < size)
{
if (a[child] < a[child + 1]&&(child+1 < size))
{
child++;
}
if (a[child]>a[parent])
{
swap(a[child], a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
break;
}
}
void HeapSort(int *a, int length)
{
for (int i = (length-2)/2; i >=0 ; i--)//建堆
{
}
for (int i = 0; i < length; i++)//排序
{
swap(a[0], a[length - 1 - i]);
}
}

第二次：7, 6, 4, 5, 2, 3 , 1 ,0,8,9

……

1.冒泡排序

void BubbleSort(int *a, int length)
{
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length -1- i;j++)
{
if (a[j]>a[j + 1])
swap(a[j], a[j + 1]);
}
}
}

i=0：  0, 3, 5, 4, 7, 1, 8, 2, 6, 9

i=1:     0, 3, 4, 5, 1, 7, 2, 6, 8, 9

i=2:     0, 3, 4, 1, 5, 2, 6 ,7 ,8, 9

-->优化

void BubbleSort(int *a, int length)
{
bool exchange = false;
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length - 1 - i; j++)
{
if (a[j]>a[j + 1])
{
swap(a[j], a[j + 1]);
exchange = true;
}
}
if (exchange == false)//若没有发生交换说明已经有序
break;
}
}

2.快速排序

int partition(int *a, int left, int right)
{
int key = a[right];
int begin = left;
int end = right - 1;
while (begin < end)
{
while (a[begin] < key)
{
++begin;
}
while (begin < end&&a[end]>key)
{
--end;
}
if (begin < end)
{
swap(a[begin], a[end]);
}
}
if (a[begin]>a[right])
{
swap(a[begin], a[right]);
return begin;
}
else
return right;
}
void QuickSort(int *a, int left,int right)
{
assert(a);
if (left < right)
{
int div = partition(a, 0, right);
QuickSort(a, 0, div - 1);
QuickSort(a, div + 1, right);
}
}

1
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：9357次
• 积分：374
• 等级：
• 排名：千里之外
• 原创：28篇
• 转载：0篇
• 译文：0篇
• 评论：0条