交换排序中主要有:冒泡排序和快速排序
(1)冒泡排序比较简单每次每次两两比较,权值小的就向上升。这样一趟下来,就会得到最小的,依次循环后就会得到有序数列。
for(int i=0;i<lenth-1;i++)
{
flag = 1;
for(int j=lenth-1;j>0;j--)
{
if(m_num[j] < m_num[j-1])
{
temp = m_num[j-1];
m_num[j-1] = m_num[j];
m_num[j] = temp;
flag = 0;
}
}
if(flag == 1) break;
}
(2)快速排序,这个在实现中的问题主要是防止递归中出现死循环。开始写的时候,由于交换条件交换条件写成m_num[j]<n,造成了死循环,在判断的时候只写了m_num[rear]>=n 而没有写head<rear,也造成了程序的死循环,由于循环的终止条件是head==rear,而且一旦交换,就会涉及坐标变化所以,所以对于head和rear的处理要特别注意。
int CChangeSort::Partition(int head,int rear)
{
double n = m_num[head];
while (head != rear)
{
while ((m_num[rear]>=n) && (head<rear))//head<rear
{
rear--;
}
if (head < rear)
{
m_num[head++] = m_num[rear];
}
while ((m_num[head]<=n) && (head<rear))
{
head++;
}
if (head < rear)
{
m_num[rear--] = m_num[head];
}
}
m_num[head] = n;
return head;
}
void CChangeSort::QuickSort(int head,int rear)
{
int n;
if (head < rear)
{
n = Partition(head,rear);
QuickSort(head,n-1);
QuickSort(n+1,rear);
}
}
快速排序是不稳定的算法,快速排序是目前基于比较的内部排序方法中速度最快的。