您的位置:首页 > 编程语言 > C语言/C++

冒泡排序,插入排序,选择排序和快速排序-C语言

2014-06-11 20:48 501 查看
这篇博文主要用于自己学习的文章梳理,方便以后回忆。

First,冒泡排序, 算法的时间复杂度是N*N ,在数据较多的时候,和快速排序比较运行时间,简直慢的掉渣,

冒泡排序的思想,主要是相邻两个元素比较,如果前一个元素比后一个元素大,则进行交换,否则继续后移,知道一次循环结束,此时最后一个元素是序列中最大的元素。

每一个趟将一个元素像冒泡一样冒出,进行n-1此循环后,序列有序。

冒泡排序主要两个FOR循环的边界。

void bubble(int *a,int len)
{
int i,j;
int temp;
for (i=0;i<len-1;++i)
{
for (j=0;j<len-i-1;j++)
{
if (a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}

}


Second,插入排序。

插入排序的主要思想是假设初始序列只有一个元素,这个元素肯定有序,每次向序列里插入一个元素,找到元素合适的位置,然后进行插入。

插入排序的核心部分就是找到该元素合适的位置。

可以将带插入的元素和 有序序列最后比较,如果比最后一个元素大,直接插入最后一个元素后面,如果比最后一个元素小,则将最后一个元素后移,知道找到合适的位置停止。

最后将待插入的元素插入到适当的位置上。

void insert(int *a,int len)
{
int i,j;
int temp;
for(i=1;i<len;i++)
{
temp=a[i];
for(j=i-1;j>=0;--j)
{
if(a[j]>temp)   //小于当前元素  元素后移
{
a[j+1]=a[j];
}
else      //大于当前元素  停止内循环
{
break;
}
}
a[j+1]=temp;
}
}


Third,选择排序,正如这种排序的名字一样,每次遍历非有序的序列,找出最小元素,放入到合适的位置上。

初始假设第一个元素有效,然后与第一个元素后面的每个元素比较,每找到比此元素小的元素,进行交换,一趟循环后,初始元素肯定是最小的。

然后依次类推,排序后面的元素。

void select(int *a,int len)
{
int i,j;
int temp;
for(i=0;i<len-1;++i)
{
for(j=i+1;j<len;++j)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}

}
Fourth,快速排序, 一个优秀的排序,还是有点回答不上来当时导师问的那个问题,为什么快速排序比别的排序要快?

只能说一下算法的大概思想了,让导师失望了,找到一个pivot,然后通过比较后,使pivot前面的元素比它小,后面的元素比它大, 然后对前半段和后半段递归的调用程序,

int  quicksort(int *a,int low,int high)
{
int i = low;
int j = high;
int temp = a[i];
if( i < j)
{
while(i < j)
{
while((a[j] >= temp) && (i < j))
{
j--;
}
a[i] = a[j];
while((a[i] <= temp) && (i < j))
{
i++;
}
a[j]= a[i];
}
a[i] = temp;

// 		quicksort(a,low,i-1);
// 		quicksort(a,j+1,high);   //递归调用函数
}
return i;  //分割点 i=j;
}
最后 。通过快速排序 ,产生了一个元素序列的划分,想一下,如果在倒数第十个元素前面的都比它小,后面的都比他大,则后面的十个元素就是最大的元素,则不需要每次遍历整个序列找出最大元素输出。

下面的代码是找到打印最大K个元素的的起点。

int find_top(int *a,int len,int count)
{
int part;
int pos=len-count;    //top—k的打印起点
part= quicksort(a,0, len - 1); //一次快排 返回分割点
while(part != pos)
{
if(part > pos)    //分割点在位置之后  应该往前查找
{
part = quicksort(a,0, part - 1   );
printf("%d\n", part);
}
else
{
part = quicksort(a , part + 1, len - 1);
printf("%d\n", part);
}
}

return part;
}


最后放上测试代码:

#include "superman.h"
int main(int argc,char *argv[])
{
int i,n=1;
int part;
int test[SIZE];
//int *test=(int *)calloc(SIZE,sizeof(int));
//srand(time(NULL));
for(i=0;i<SIZE;++i)
{
test[i]=rand()%100;
}
printf("nowadays the array is waiting to sort...........:\n");
for (i=0;i<SIZE;++i)
{
printf("%d ",test[i]);
}
printf("\n");
printf("******************all_sort**********************\n");
printf("******************1:bubble_sort*****************\n");
printf("******************2:insert_sort*****************\n");
printf("******************3:select_sort*****************\n");
printf("******************4:quick_sort******************\n");
printf("******************updating......****************\n");
// 	bubble(test,SIZE);
// 	printf("bubble over!\n");
//
// 	select(test,SIZE);
// 	printf("select over!\n");
//
// 	quick(test,SIZE);
// 	printf("quick over!\n");
//
// 	insert(test,SIZE);
// 	printf("insert over!\n");

while(fflush(stdin),printf("please input the number to select sort :"),scanf("%d",&n)!=EOF)
{

//printf("\n");
//scanf("%d",&n);
switch(n)
{
case 1:
bubble(test,SIZE);
show(test,SIZE);
break;
case 2:
insert(test,SIZE);
show(test,SIZE);
break;
case 3:
select(test,SIZE);
show(test,SIZE);
break;
case 4:
part=find_top(test,SIZE,5);
for(i=part;part<SIZE;part++)
{
printf("%d ",test[part]);
}
//quicksort(test,0,SIZE-1);
//show(test,SIZE);
break;
default:
printf("Error!\n");
break;
}
}

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐