一、普通实现冒泡排序
冒牌排序的基本思想是:设待排序元素序列中的元素个数为n,首先比较第n-2个元素和第n-1个元素,如果发生逆序,则交换两个元素。其余处理方式相同。
void BubbleSort(int V[], int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = 1; j < n-i; ++j)
{
if(V[j-1] > V[j])
{
int tmp = V[j-1];
V[j-1] = V[j];
V[j] = tmp;
}
}
}
}
二、加入bool标志避免顺序已排好还进行排序,浪费时间
加入bool值exchange用以标志本趟循环是否交换数据,若为false则直接结束。
void NewBubbleSort(int V[], int n)
{
bool exchange;
for(int i = 0; i < n; ++i)
{
for(int j = 1; j < n-i; ++j)
{
exchange = false;
if(V[j-1] > V[j])
{
int tmp = V[j-1];
V[j-1] = V[j];
V[j] = tmp;
exchange = true;
}
}
if(!exchange)
{
return;
}
}
}
三、直接插入排序
直接插入排序的基本思想:当插入第i(i>=1)个元素时,前面的V[0]、V[1],……,V[i-1]已经排好序。这时用V[i]的排序码与V[i-1],V[i-2],……的排序码顺序进行比较,找到插入排序即将V[i]插入,原来位置上的元素向后顺移。
void InsertSort(int V[], int left, int right)
{
int i, j;
for(i = left+1; i < right+1; ++i)
{
if(V[i] < V[i-1])
{
int tmp = V[i];
j = i-1;
do
{
V[j+1] = V[j];
j--;
}while(j >= left && tmp < V[j]);
//向后移位
V[j+1] = tmp;
}
}
}
四、折半插入排序(二分法插入排序)
折半插入排序(二分法插入排序)的基本思想:设有一个元素序列V[0]、V[1]、V[2]……V[n-1]。其中V[0]、V[1]、V[2]……V[i-1]都是已经排好序的元素。在插入V[i]时,利用折半搜索法寻找V[i]的插入位置。
void BinaryInsertSort(int V[], int left, int right)
{
int tmp, i, low, high, middle, k;
for(i = left+1; i < right+1; ++i)
{
tmp = V[i];
low = left;
high = i-1;
while(low <= high)
{
middle = (low+high)/2;
if(tmp < V[middle])
{
high = middle-1;
}
else
{
low = middle+1;
}
}
for(k = i-1; k >= low; --k)
//向后移位,移开插入的位置
{
V[k+1] = V[k];
}
V[low] = tmp;//插入
}
}
五、希尔排序
希尔排序的基本思想:设待排序元素序列有n个,首先取整数gap
void ShellSort(int V[], int left, int right)
{
int i, j, gap = right-left+1, tmp;
do
{
gap = gap/3+1;//求下一增量
for(i = left+gap; i < right+1; ++i)
{
if(V[i] < V[i-gap])
{
tmp = V[i];
j = i-gap;
do
{
V[j+gap] = V[j];//后移元素
j = j-gap; //再比较前一元素
}while(j >= left && tmp < V[j]);
V[j+gap] = tmp;
}
}
}while(gap > 1);
}