五种排序算法
#include <iostream>
#include <stdlib.h>
using namespace std;
/插入排序// 插入排序是从数组中不断的取出元素并将其插入到已好排序的数组中的适当位置,
void sort(int *a,int n){
int j,t,i;
for(i=1;i<n;i++){
j=i;
t=a[i]; //保存插入值 (待排序数组中的首元素),
while(j>0 && a[j-1]>t){ //从J开始向a[0]扫描,不断把较大的值向后移动
a[j--]=a[j-1];
}
a[j]=t; // 直到扫描到a[j-1]=<a[j] || j>0 时,把待插入值插入正确位置
}
}
/希尔排序// 希尔排序是插入排序的加强版, 原理: 首先将数组按步长gap=length/2分为n组, 每组两个元素,第N组的一个元素的下标为N-1 第二个元素下标为N-1+cap 对每组的元素进行插入排序,然后将步长减半,再次分组,再次对每组进行插入排序,一直划分到gap=1为止 void shellsort(int *a,int n){ int gap = n/2; // 分组 while(gap>=1){ for(int i=gap;i<n;i++){ //循环n-gap次(完成所有组的排序) int j,t=a[i]; // j==每组的第一个元素 t=第二个元素 for(j=i-gap;j>=0 && a[j]>t;j=j-gap){ // ! j=j-gap (终止循环)(1) a[j+gap]=a[j]; //如果满足条件,把每组的第一个元素赋值给第二个 } a[j+gap]=t; // 因为(1)处改变了j的值,这里要加回来 (把T赋值给第一个元素(完成交换)) } gap/=2; //重新分组 } } ///冒泡排序 最简单的排序算法
void sort1(int *a,int n){
int i,j,t;
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(a[i]>a[j]){
t=a[j];
a[j]=a[i];
a[i]=t;
}
}
}
}.
选择排序 选择排序的原理是不断的从待排序数组中找出最小值,并放入拟构的新数组中,从而组成排好序的数组
void sort2(int *a,int n){
int i,j,min,t;
for(i=0;i<n;i++){
min=i; //用于存放最小值下标
for(j=i+1;j<n;j++){ //找出最小值下标
if(a[min]>a[j]){
min=j;
}
}
if(i!=min){ //把最小值插入已经排好序的数组
t=a[i];
a[i]=a[min];
a[min]=t;
}
}
}
快速排序 原理: 从数组中找出一个基准值,把比它小的数放在右边,大的放在左边,划分为两段,然后对划分出来的两段进行相同操作
void sort3(int *a,int l,int r){
if(l<r){
int i=l,j=r,x=a[l];
while(i<j){
while(i<j && a[j]>=x){ //从右向左找出小于基准的元素的下标
j--;
}
if(i<j){ (1)
a[i++]=a[j];
}
while(i<j && a[i]<x){ //从左向右找出大于基准元素的下标
i++;
}
if(i<j){ (2)
a[j--]=a[i];
}
}
a[i]=x; (3)
sort3(a,l,i-1);
sort3(a,i+1,r);
}
}
int main(void)
{
int a[]={5,0,2,3,4,6};
sort1(a,6);
cout<<a[0]<<endl;
return 0;
}
|
正在加载中...