image.png
冒泡排序
一趟排序后饭于,一定把表中最大或最小元素放在其最終位置。
若采用冒泡排序法對序列(10,41,52,18,26,29)按從大到小進行排序壹无,則排序過程中需要進行的元素之間的比較次數(shù)是___拍埠。
提取n個中最大(小)的元素放到最后速和,然后n-1個元素在取最大(小)的放在滴n-1個位置剥汤。
在一趟排序中前后兩個元素對比颠放,相反則交換位置。
image.png
5+4+3=12
插入排序法
從第二個元素開始吭敢,和前面的比大小碰凶,只要比前面的小就往前插入,直到比前面的大停止鹿驼。然后第三個
void INSERTSORT(keytype K[],int n)
{
int i,j;
keytype temp;
for(i=2;i<=n;i++){
temp=K[i];
j=i-1;
while(j>0&&temp<K[j]) //將temp與K[j]循環(huán)比較
K[j+1]=K[j--]; //如果temp比前面的小欲低,前面的元素后移
K[j+1]=temp; //temp插入當前位置
}
}
選擇排序法
希爾排序法
快速排序
#include <stdio.h>
int qusort(int s[],int start,int end) //自定義函數(shù) qusort()
{
int i,j; //定義變量為基本整型
i=start; //將每組首個元素賦給i
j = end; //將每組末尾元素賦給j
s[0]=s[start]; //設置基準值
while(i<j)
{
while(i<j&&s[0]<s[j])
j--; //位置左移
if(i<j)
{
s[i]=s[j]; //將s[j]放到s[i]的位置上
i++; //位置右移
}
while(i<j&&s[i]<=s[0])
i++; //位置左移
if(i<j)
{
s[j]=s[i]; //將大于基準值的s[j]放到s[i]位置
j--; //位置左移
}
}
s[i]=s[0]; //將基準值放入指定位置
if (start<i)
qusort(s,start,j-1); //對分割出的部分遞歸調(diào)用qusort()函數(shù)
if (i<end)
qusort(s,j+1,end);
return 0;
}
int main()
{
int i,a[] = {11,99,45,12,36,69,22,62,796,4,696};//定義數(shù)組及變量為基本整型
qusort(a,1,10); //調(diào)用qusort()函數(shù)進行排序
printf("排序后的順序是:\n");
for(i=1;i<=10;i++)
printf("%5d",a[i]); //輸出排好序的數(shù)組
printf("\n");
return 0;
}
排序后的順序是:
4 12 22 36 45 62 69 99 696 796
遞歸快排
void QUICK(keytype K[],int s,int t)
{
int i,j;
if(s<t){
i=s;
j=t+1;
while(1){
do i++;
while(!(K[s]<=K[i] || i==t));
do j--;
while(!(K[s]>=K[j] || j==s));
if(i<j)
SWAP(K[i],K[j]); /*交換K[i]與K[j]的位置*/
else
break;
}
SWAP(K[s],K[j]); /*交換K[s]與K[j]的位置*/
QUICK(K,s,j-1); /*對前一部分排序*/
QUICK(K,j+1,t); /*對后一部分排序*/
}
}
取第一個元素,正序從第二個開始蠢沿,找比第一個元素大的伸头,倒序從第n個元素開始找比第一個元素小的,然后相互交換位置舷蟀,循環(huán)重復。
image.png