排序算法
来源:互联网 发布:夏俊峰案网络舆论 编辑:程序博客网 时间:2024/06/10 11:00
一、冒泡算法优化
优势:避免了多次的不必要的排序
void bubble_sort2(sqlist *L){ int i,j; bool flag = true; for(i=1;i<L->length&&flag;i++) { flag = false; for(j=L->length-1;j>=i;j--) { if(L->r[j]>L->r[j+1]) { swap(L,j,j+1); flag = true; } } }}
二、简单选择排序
优势:减少了交换数据的次数
void simpleSelectionSort1(SqList *L) { int i,j,min; //1.进行n-1趟选择,每次选出第i小记录 for(i=1;i<L->length;i++) { min=i; //2.选择第i小记录 for(j=i+1;j<=L->length;j++) { if(L->r[min]<L->r[j]) min=j; } //3.与第i个记录交换 if(min!=i) swap(L,i,min) }}
三、直接插入排序
优势:虽然与冒泡排序的效率相同。但它在速度上还是要高点,这是因为在冒泡排序下是进行值交换,而在插入排序下是值移动,所以直接插入排序将要优于冒泡排序。
void InsertSort(SqList *L) { int i,j; for (i=1;i<L->length;i++) { if (L->r[i]<L->r[i-1]) { L->r[0]=L->r[i]; //设立空位 for (j=i-1;L->r[i]>L->r[0];j--) L->r[j+1]=L->r[j]; L->r[j+1]=L->r[0]; //插入正确的位置 } } }
四、快速排序
#include <stdio.h>#include <stdlib.h> void swap(int *x,int *y){ int temp; temp = *x; *x = *y; *y = temp;}int choose_pivot(int i,int j ){ return((i+j) /2);}void quicksort(int list[],int m,int n){ int key,i,j,k; if( m < n) { k = choose_pivot(m,n); swap(&list[m],&list[k]); key = list[m]; i = m+1; j = n; while(i <= j) { while((i <= n) && (list[i] <= key)) i++; while((j >= m) && (list[j] > key)) j--; if( i < j) swap(&list[i],&list[j]); } // 交换两个元素的位置 swap(&list[m],&list[j]); // 递归地对较小的数据序列进行排序 quicksort(list,m,j-1); quicksort(list,j+1,n); }}void printlist(int list[],int n){ int i; for(i=0;i<n;i++) printf("%d\t",list[i]);}void main(){ const int MAX_ELEMENTS = 10; int list[MAX_ELEMENTS]; int i = 0; // 产生填充序列的随机数 for(i = 0; i < MAX_ELEMENTS; i++ ){ list[i] = rand(); } printf("进行排序之前的序列:\n"); printlist(list,MAX_ELEMENTS); // sort the list using quicksort quicksort(list,0,MAX_ELEMENTS-1); // print the result printf("使用快速排序算法进行排序之后的序列:\n"); printlist(list,MAX_ELEMENTS);}
五、归并算法
//将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c[]) { int i, j, k; i = j = k = 0; while (i < n && j < m) { if (a[i] < b[j]) c[k++] = a[i++]; else c[k++] = b[j++]; } while (i < n) c[k++] = a[i++]; while (j < m) c[k++] = b[j++]; }
可以看出合并有序数列的效率是比较高的,可以达到O(n)。
解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?
可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。
//将有二个有序数列a[first...mid]和a[mid...last]合并。 void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for (i = 0; i < k; i++) a[first + i] = temp[i]; } void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; mergesort(a, first, mid, temp); //左边有序 mergesort(a, mid + 1, last, temp); //右边有序 mergearray(a, first, mid, last, temp); //再将二个有序数列合并 } } bool MergeSort(int a[], int n) { int *p = new int[n]; if (p == NULL) return false; mergesort(a, 0, n - 1, p); delete[] p; return true; }
0 0
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- 排序算法
- Android 内存优化 (防Memory Leak)
- android开发步步为营之110:android反编译apk
- 《TCP/IP详解 卷1:协议》 读书笔记 第11章 UDP:用户数据报协议
- 数据结构——18 二叉树(非递归)
- Java函数的基础介绍
- 排序算法
- 华为机试第一题[2016年8月18日上午]计算重复字符
- EventBus详解
- iOS中集成ijkplayer视频直播框架
- busybox login: root Login incorrect
- xctool的使用
- Android 内存管理 &Memory Leak & OOM 分析
- 如何判断字符串包含的是数字
- (常用file类练习)递归打印文件目录