主程序:
int main() {
//输入
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
SelectSort(a,n);
BubbleSort(a,n);
InsertSort(a,n);
//输出
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
选择排序:从未排序的数据中选出最小的一个元素顺序放在已经排好序的数列最后。
void SelectSort(int *a, int n){
//选择排序
int min; //记录最小值的下标
for(int i=0;i<n;i++){
min=i;
for(int j=i;j<n;j++){
if(a[j]<a[min]){
min=j;
}
}
std::swap(a[i],a[min]); //交换两个数的值
}
}
冒泡排序:从前到后,相邻两数相比,小的放前,大的放后。遍历一次后,最大的数放在了最后。
void BubbleSort(int *a, int n){
//冒泡排序
for(int i=n-1;i>0;i--){
//a[0]~a[n-1]之间两两交换
//a[0]~a[n-2]之间两两交换
//……
for(int j=0;j<i;j++){
if(a[j]>a[j+1])
std::swap(a[j],a[j+1]);
}
}
}
插入排序:将b插入到已经排好序的数列a1,a2,...,an中:从后往前扫描,若ai大于b,就将ai往后移;若ai小于等于b,就将b插入到ai的后面。
void InsertSort(int *a, int n){
//插入排序
for(int i=1;i<n;i++){
//将a[1]插入到前面的有序数列中
//将a[2]插入到前面的有序数列中
//……
for(int j=i;j>0;j--){
if(a[j]<a[j-1]){
std::swap(a[j],a[j-1]);
}
}
}
}
希尔排序:分组
void ShellSort(int *a, int n){
for(int gap = n/2;gap>=1;gap=gap/2){
for(int i=gap;i<n;i++){
//对a[i]所在的分组进行插入排序
int j;
int temp = a[i];
for(j=i-gap;j>=0&&a[j]>temp;j=j-gap){
a[j+gap] = a[j];
}
a[j+gap] = temp;
}
}
}
快速排序:选择一个关键数
int Partition(int *a, int low, int high){
//交换数组a中的元素,使基准元素到位,返回其所在的位置
while(low<high){
//a[low]是基准元素
while(low<high && a[high]>a[low])
high--;
std::swap(a[high], a[low]);
//a[high]是基准元素
while(low<high && a[low]<a[high])
low++;
std::swap(a[low], a[high]);
}
return low;
}
void QuickSort(int *a, int low, int high){
if(low>=high) return; //important! 否则,死循环 例子: 10 9 8 7 6 5 4 3 2 1
int pivotIndex = Partition(a, low, high);
QuickSort(a, low, pivotIndex-1);
QuickSort(a, pivotIndex+1, high);
}