數據結構中各類排序算法
一、插入排序
1.直接插入排序
#include<iostream>
usingnamespacestd;
int main()
{
int a[]={98,76,109,34,67,190,80,12,14,89,1};
int k=sizeof(a)/sizeof(a[0]);
int j;
for(int i=1;i<k;i++)//循環從第2個元素開始
{
if(a[i]<a[i-1])
{
int temp=a[i];
for(j=i-1;j>=0 && a[j]>temp;j--)
{//下方爭論皆因未加大括號引起誤解,故增加以避免誤導
a[j+1]=a[j];
}
a[j+1]=temp;//此處就是a[j+1]=temp;
}
}
for(intf=0;f<k;f++)
{
cout<<a[f]<<"";
}
return0;
}
直接插入排序的優缺點:2.Shell排序(希爾排序)
/*
*D.Shell最初的算法。
*/
int shellsortSh(int p[],int n)
{
int op=0;
int h,i,j,temp;
for(h=n/2;h>0;h=h/2){
for(i=h;i<n;i++){
temp=p[i];
for(j=i-h;j>=0&&p[j]>temp;j-=h){
p[j+h]=p[j];
op++;
}
p[j+h]=temp;
op++;
}
}
return op;
}
二、交換排序
1.冒泡排序
#include<stdio.h>
#defineSIZE8
voidbubble_sort(inta[],intn);
voidbubble_sort(inta[],intn)//n爲數組a的元素個數
{
inti,j,temp;
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
{
if(a[i]>a[i+1])//數組元素大小按升序排列
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
intmain()
{
intnumber[SIZE]={95,45,15,78,84,51,24,12};
inti;
bubble_sort(number,SIZE);
for(i=0;i<SIZE;i++)
{
printf("%d",number[i]);
}
printf("\n");
}
對冒泡排序的改進:交替冒泡排序
2.快速排序
下標
|
0
|
1
|
2
|
3
|
4
|
5
|
數據
|
6
|
2
|
7
|
3
|
8
|
9
|
下標
|
0
|
1
|
2
|
3 |
4
|
5
|
數據
|
3
|
2
|
7
|
3
|
8
|
9
|
下標
|
0
|
1
|
2
|
3
|
4
|
5
|
數據
|
3
|
2
|
7
|
7
|
8
|
9
|
下標
|
0
|
1
|
2
|
3
|
4
|
5
|
數據
|
3
|
2
|
6
|
7
|
8
|
9
|
void QuickSort(int a[],int numsize)/*a是整形數組,numsize是元素個數*/
{
int i=0,j=numsize-1;
int val=a[0];/*指定參考值val大小*/
if(numsize>1)/*確保數組長度至少爲2,否則無需排序*/
{
while(i<j)/*循環結束條件*/
{
/*從後向前搜索比val小的元素,找到後填到a[i]中並跳出循環*/
for(;j>i;j--)
if(a[j]<val)
{
a[i++]=a[j];
break;
}
/*從前往後搜索比val大的元素,找到後填到a[j]中並跳出循環*/
for(;i<j;i++)
if(a[i]>val)
{
a[j--]=a[i];
break;
}
}
a[i]=val;/*將保存在val中的數放到a[i]中*/
QuickSort(a,i);/*遞歸,對前i個數排序*/
QuickSort(a+i+1,numsize-i-1);/*對i+2到numsize這numsize-1-i個數排序*/
}
}
算法時間複雜度:O(nlogn)