冒泡排序,插入排序,选择排序和快速排序-C语言
2014-06-11 20:48
573 查看
这篇博文主要用于自己学习的文章梳理,方便以后回忆。
First,冒泡排序, 算法的时间复杂度是N*N ,在数据较多的时候,和快速排序比较运行时间,简直慢的掉渣,
冒泡排序的思想,主要是相邻两个元素比较,如果前一个元素比后一个元素大,则进行交换,否则继续后移,知道一次循环结束,此时最后一个元素是序列中最大的元素。
每一个趟将一个元素像冒泡一样冒出,进行n-1此循环后,序列有序。
冒泡排序主要两个FOR循环的边界。
Second,插入排序。
插入排序的主要思想是假设初始序列只有一个元素,这个元素肯定有序,每次向序列里插入一个元素,找到元素合适的位置,然后进行插入。
插入排序的核心部分就是找到该元素合适的位置。
可以将带插入的元素和 有序序列最后比较,如果比最后一个元素大,直接插入最后一个元素后面,如果比最后一个元素小,则将最后一个元素后移,知道找到合适的位置停止。
最后将待插入的元素插入到适当的位置上。
Third,选择排序,正如这种排序的名字一样,每次遍历非有序的序列,找出最小元素,放入到合适的位置上。
初始假设第一个元素有效,然后与第一个元素后面的每个元素比较,每找到比此元素小的元素,进行交换,一趟循环后,初始元素肯定是最小的。
然后依次类推,排序后面的元素。
只能说一下算法的大概思想了,让导师失望了,找到一个pivot,然后通过比较后,使pivot前面的元素比它小,后面的元素比它大, 然后对前半段和后半段递归的调用程序,
下面的代码是找到打印最大K个元素的的起点。
最后放上测试代码:
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; }
相关文章推荐
- C语言:冒泡排序、选择排序、快速排序、插入排序、“shell”法
- c语言排序之冒泡排序,选择排序,插入排序,快速排序总结
- c语言中的几种排序算法——冒泡排序、快速排序、插入排序、选择排序
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 冒泡排序、快速排序、选择排序、插入排序、shell排序C代码
- 八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
- 各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- 【算法】希尔排序,快速排序,选择排序,插入排序,冒泡排序
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序
- Java分别实现冒泡排序、插入排序、快速排序、选择排序、交换排序
- (一)Java实现排序,选择排序,快速排序,冒泡排序,插入排序
- 冒泡排序、插入排序、快速排序、选择排序
- 基本算法简单实现-二分法查找、合并排序、冒泡排序、插入排序、选择排序、快速排序
- 排序算法(插入排序、shell排序、冒泡排序、选择排序、合并排序、堆排序、快速排序、计数排序、基数排序、桶排序)
- 几种基本的排序算法(选择排序,冒泡排序,快速排序,归并排序,希尔排序)C语言实现
- 插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序
- Java实现排序(快速排序、冒泡排序、选择排序、基数排序、插入排序)