#include <cstdio>
/*插入排序
-直接插入排序
-选择插入排序
-希尔排序
*/
void direct_insert_sort(int *d,int len)//比较次数n^2 时间复杂度n^2 稳定排序
{
int i,j,temp;
for(i=1;i<len;i++){
if(d[i-1]>d[i]){
temp=d[i];
for(j=i-1;j>=0&&d[j]>temp;j--){
d[j+1]=d[j];
}
d[j+1]=temp;
}
}
}
void binary_insert_sort(int* d,int len)//比较次数nlog2n 时间复杂度n^2 稳定算法
{
int i,j,mid,low,high,temp;
for(i=1;i<len;i++){
if(d[i-1]>d[i]){
low=0;high=i-1;
temp=d[i];
while(low<=high){
mid=(low+high)/2;
if(temp<d[mid]){
high=mid-1;
}else{
low=mid+1;
}
}
for(j=i-1;j>=high+1;j--){
d[j+1]=d[j];
}
d[high+1]=temp;
}
}
}
void shell_sort(int *d,int len)//不稳定算法 n^1.3
{
int i,j,dk,temp;
for(dk=len/2;dk>=1;dk/=2){
for(i=dk+1;i<len;i++){
if(d[i-dk]>d[i]){
temp=d[i];
for(j=i-dk;j>=0&&d[j]>temp;j-=dk){
d[j+dk]=d[j];
}
d[j+dk]=temp;
}
}
}
}
/*选择排序
-简单选择排序
-堆排序
*/
void simple_select_sort(int* d,int len)//不稳定算法 时间复杂度n^2
{
int i,j,min,temp;
for(i=0;i<len;i++){
min=i;
for(j=i+1;j<len;j++){
if(d[j]<d[min]){
min=j;
}
}
if(min!=i){
temp=d[min];
d[min]=d[i];
d[i]=temp;
}
}
}
void head_adjust(int* a,int k,int len)
{
int i,temp;
temp=a[k];
for(i=2*k;i<=len;i*=2){
if(i<len&&a[i]<a[i+1]){
i++;
}
if(temp>=a[i]){
break;
}else{
a[k]=a[i];
k=i;
}
}
a[k]=temp;
}
void build_max_heap(int* a,int len)
{
for(int i=len/2;i>0;i--){
head_adjust(a,i,len);
}
}
void heap_sort(int* a,int len)//不稳定算法 时间复杂度nlog2n
{
int i,temp;
build_max_heap(a,len);
for(i=len;i>1;i--){
temp=a[i];
a[i]=a[1];
a[1]=temp;
head_adjust(a,1,i-1);
}
}
/*交换排序
-冒泡排序
-快速排序
*/
void bubble_sort(int* a,int len)//稳定算法 时间复杂度
{
int i,j,temp;
bool flag=false;
for(i=0;i<len-1;i++){
flag=false;
for(j=len-1;j>i;j--){
if(a[j-1]>a[j]){
flag=true;
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
if(flag==false)break;
}
}
int partition(int* d,int low,int high)
{
int pivot=d[low];
while(low<high){
while(low<high&&pivot<=d[high])high--;
d[low]=d[high];
while(low<high&&d[low]<=pivot)low++;
d[high]=d[low];
}
d[low]=pivot;
return low;
}
void quick_sort(int* d,int low,int high)//不稳定算法 时间复杂度nlog2n
{
if(low<high){
int mid=partition(d,low,high);
quick_sort(d,low,mid-1);
quick_sort(d,mid+1,high);
}
}
/*
-归并排序
*/
void merge(int *a,int low,int mid,int high)
{
int *temp=new int[high-low+1];
int i,j,k;
for(i=low;i<=high;i++){
temp[i-low]=a[i];
}
for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){
if(temp[i-low]<=temp[j-low]){
a[k]=temp[i-low];i++;
}else{
a[k]=temp[j-low];j++;
}
}
while(i<=mid){
a[k++]=temp[i-low];i++;
}
while(j<=high){
a[k++]=temp[j-low];j++;
}
delete[]temp;
}
void merge_sort(int* a,int low,int high)//稳定 时间复杂度nlog2n 空间复杂度n
{
if(low<high){
int mid=(low+high)/2;
merge_sort(a,low,mid);
merge_sort(a,mid+1,high);
merge(a,low,mid,high);
}
}
void print_data(int *d,int len)
{
printf("ID:");
for(int i=0;i<len;i++){
printf("%d",i);
if(i!=len-1)printf(" ");
}
printf("\n");
printf("DA:");
for(int i=0;i<len;i++){
printf("%d",d[i]);
if(i!=len-1)printf(" ");
}
printf("\n");
}
int main(void)
{
int data[]={9,8,7,6,5,4,3,2,1,0};
int len=sizeof(data)/sizeof(int);
bubble_sort(data,len);
print_data(data,len);
return 0;
}
数据排序排序算法C语言实现
最新推荐文章于 2024-10-06 22:44:39 发布