动画过程参考:一像素 —— 十大经典排序算法
for(i = 1;i < n;i++)
{
temp = arr[i];
j = i-1;
while(j>=0 && temp<arr[j])
{
arr[j+1] = arr[j];
--j;
}
arr[j+1] = temp;
}
for(i=1;i<n;i++)
{
x = arr[i];
low = 0;
high = i-1; //已排序列 [0~i-1]
while(low<=high)
{
m = (low+high)/2; //折半
if(x>arr[m]) //修改左或右端值
low = m+1;
else
high = m-1;
}
for(j=i-1;j>high;j--) //移动数组留出待插位置
arr[j+1] = arr[j];
arr[j+1] = x;
}
子序列1:49 13
子序列2: 38 27
子序列3: 65 49
子序列4: 97 55
子序列5: 76 04
子序列1:13 49
子序列2: 27 38
子序列3: 49 65
子序列4: 55 97
子序列5: 04 76
for(gap=n/2;gap>0;gap=gap/2) //分割序列
for(i=0;i<n;i++)
for(j=i+gap;j<n;j=j+gap)
if(arr[j]<arr[j-gap]) //若同组内序列非有序,则需插入
{
temp = arr[j];
k = j-gap;
while(k>=0 && arr[k]>temp) //移动至合适位置插入过程
{
arr[k+gap] = arr[k];
k = k-gap;
}
arr[k+gap] = temp;
}
已知一个序列,例如 arr[5]={9,7,5,3,1};
for(i=n-1;i>=1;i--) //每趟排序把最大元素移至后面
{
flag = 0;
for(j=1;j<=i;j++) //从左往右,相邻元素比较
if(arr[j-1]>arr[j]) //交换移动
{
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
flag = 1;
}
if(flag==0) //若某趟排序中没有发生交换,标志排序完毕
return;
}
基本思路在于设定一个枢轴值,将序列小于、大于它的元素分别 置于其两侧 ,再对2子序列重复该过程:
已知序列 arr[8]={49,38,65,97,76,13,27,49},序列左右标记为 i,j;
int temp; //枢轴
int i = low,j = high; //左右标记
if(low<high) //左右标记未相遇,可再进行排序时
{
temp = arr[low]; //取得枢轴
while(i<j)
{
while(j>i && arr[j]>=temp) //先右标左移,直到小于枢轴的数
--j;
if(i<j)
{
arr[i] = arr[j]; //小元素前赋值
++i;
}
while(i<j && arr[i]<temp) //再左标右移,直到大于枢轴的数
++i;
if(i<j)
{
arr[j] = arr[i]; //大元素后赋值
--j;
}
}
arr[i] = temp; //枢轴归位
QuickSort(arr,low,i-1); //排左序列
QuickSort(arr,i+1,high); //排右序列
}
将原序列看作有序序列与无序序列组成(初始全为无序序列):
```
for(i=0;i<n;i++) //默认无需序列首元素为待交换值
{
k = i; //无序序列内最小值标记
for(j=i+1;j<n;j++) //扫描无序序列
if(arr[k]>arr[j]) //更新 k
k = j;
temp = arr[i]; //最小值与首元素交换
arr[i] = arr[k];
arr[k] = temp;
}
```
---恢复内容结束---
# 排序算法动画过程参考:一像素 —— 十大经典排序算法
for(i = 1;i < n;i++)
{
temp = arr[i];
j = i-1;
while(j>=0 && temp<arr[j])
{
arr[j+1] = arr[j];
--j;
}
arr[j+1] = temp;
}
for(i=1;i<n;i++)
{
x = arr[i];
low = 0;
high = i-1; //已排序列 [0~i-1]
while(low<=high)
{
m = (low+high)/2; //折半
if(x>arr[m]) //修改左或右端值
low = m+1;
else
high = m-1;
}
for(j=i-1;j>high;j--) //移动数组留出待插位置
arr[j+1] = arr[j];
arr[j+1] = x;
}
子序列1:49 13
子序列2: 38 27
子序列3: 65 49
子序列4: 97 55
子序列5: 76 04
子序列1:13 49
子序列2: 27 38
子序列3: 49 65
子序列4: 55 97
子序列5: 04 76
for(gap=n/2;gap>0;gap=gap/2) //分割序列
for(i=0;i<n;i++)
for(j=i+gap;j<n;j=j+gap)
if(arr[j]<arr[j-gap]) //若同组内序列非有序,则需插入
{
temp = arr[j];
k = j-gap;
while(k>=0 && arr[k]>temp) //移动至合适位置插入过程
{
arr[k+gap] = arr[k];
k = k-gap;
}
arr[k+gap] = temp;
}
已知一个序列,例如 arr[5]={9,7,5,3,1};
for(i=n-1;i>=1;i--) //每趟排序把最大元素移至后面
{
flag = 0;
for(j=1;j<=i;j++) //从左往右,相邻元素比较
if(arr[j-1]>arr[j]) //交换移动
{
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
flag = 1;
}
if(flag==0) //若某趟排序中没有发生交换,标志排序完毕
return;
}
基本思路在于设定一个枢轴值,将序列小于、大于它的元素分别 置于其两侧 ,再对2子序列重复该过程:
已知序列 arr[8]={49,38,65,97,76,13,27,49},序列左右标记为 i,j;
int temp; //枢轴
int i = low,j = high; //左右标记
if(low<high) //左右标记未相遇,可再进行排序时
{
temp = arr[low]; //取得枢轴
while(i<j)
{
while(j>i && arr[j]>=temp) //先右标左移,直到小于枢轴的数
--j;
if(i<j)
{
arr[i] = arr[j]; //小元素前赋值
++i;
}
while(i<j && arr[i]<temp) //再左标右移,直到大于枢轴的数
++i;
if(i<j)
{
arr[j] = arr[i]; //大元素后赋值
--j;
}
}
arr[i] = temp; //枢轴归位
QuickSort(arr,low,i-1); //排左序列
QuickSort(arr,i+1,high); //排右序列
}
将原序列看作有序序列与无序序列组成(初始全为无序序列):
for(i=0;i<n;i++) //默认无需序列首元素为待交换值
{
k = i; //无序序列内最小值标记
for(j=i+1;j<n;j++) //扫描无序序列
if(arr[k]>arr[j]) //更新 k
k = j;
temp = arr[i]; //最小值与首元素交换
arr[i] = arr[k];
arr[k] = temp;
}
原文:https://www.cnblogs.com/SouthBegonia/p/10868732.html