排序算法
一.冒泡排序:
1 #include "stdio.h" 2 int main() 3 { 4 int a[10] = {1,3,4,2,6,9,8,7,10,5}; 5 for(int i = 0;i < 9;i++)//为什么只有9次外循环? 因为10个数只需要进行9次比较, 6 for(int j = 0;j < 9 - i;j++)//为什么要从0开始到9 - i, 因为是从前往后冒泡,每次会排好未排好序列最后一个数 7 if(a[j] > a[j + 1]){ 8 int temp = a[j]; 9 a[j] = a[j + 1]; 10 a[j + 1] = temp; 11 } 12 13 for(int i = 0;i < 10;i++) 14 printf("%d ",a[i]); 15 return 0; 16 }
二.选择排序:
1 #include "stdio.h" 2 int main() 3 { 4 int a[10] = {10,9,8,7,6,5,4,3,2,1};//1,3,4,2,6,9,8,7,10,5 5 for(int i = 0;i < 9;i++){//所谓选择排序就是每次都找一个找小或者最大值放到最后或者最前面的位置 6 int min = i;//选择位置 7 for(int j = i + 1;j < 10;j++) 8 if(a[min] > a[j]) min = j;//如果有比这个数小的,则更新下标 9 if(min != i) { 10 int temp = a[i]; 11 a[i] = a[min]; 12 a[min] = temp; 13 } 14 } 15 16 for(int i = 0;i < 10;i++) 17 printf("%d ",a[i]); 18 return 0; 19 }
三.直接插入排序:
1 #include "stdio.h" 2 int main() 3 { 4 int a[10] = {1,3,4,2,6,9,8,7,10,5}; 5 for(int i = 1;i < 10;i++){//插入排序第一个相当于是已经排好了的,只需要把后面的往前面插入即可 6 int temp = a[i];//保存需要插入的值 7 int j; 8 for(j = i - 1;j >= 0 && a[j] > temp;j--)//这个循环只要是查找插入的位置 9 a[j + 1] = a[j]; 10 a[j + 1] = temp;//进行插入 11 } 12 for(int i = 0;i < 10;i++) 13 printf("%d ",a[i]); 14 return 0; 15 }
四.二分法优化后的直接插入排序:
1 #include "stdio.h" 2 int binery_search(int l,int r,int *a,int temp) 3 { 4 while(l <= r){ 5 int m = (l + r) / 2; 6 if(a[m] <= temp) 7 l = m + 1; 8 else 9 r = m - 1; 10 } 11 return r; 12 } 13 int main() 14 { 15 int a[10] = {1,3,4,2,6,9,8,7,10,5}; 16 for(int i = 1;i < 10;i++){ 17 int index = binery_search(0,i-1,a,a[i]);//进行二分搜索插入位置 18 if(i != index){//当属于当前位置时不用插入 19 int temp = a[i]; 20 int j; 21 for(j = i - 1;j > index;j--) 22 a[j + 1] = a[j]; 23 a[j + 1] = temp; 24 } 25 } 26 27 for(int i = 0;i < 10;i++) 28 printf("%d ",a[i]); 29 return 0; 30 }
五.希尔排序:
1 #include "stdio.h" 2 int main() 3 { 4 int m = 10 / 2; 5 int a[10] = {1,3,4,2,6,9,8,7,10,5}; 6 while(m > 0){//希尔排序实际上就是一个带间隔的插入排序 7 for(int i = m;i < 10;i++){ 8 int temp = a[i]; 9 int j; 10 for(j = i - m;j >= 0 && a[j] >= temp;j -= m) 11 a[j + m] = a[j]; 12 a[j + m] = temp; 13 } 14 m /= 2; 15 } 16 for(int i = 0;i < 10;i++) 17 printf("%d ",a[i]); 18 return 0; 19 }
六.快速排序:
1 #include "stdio.h" 2 void quick_sort(int *a,int s,int e) 3 { 4 int i = s,j = e; 5 if(s > e) return;//如果已经排好了则返回 6 int temp = a[s]; 7 while(i < j){ 8 while(i < j && a[j] >= temp) 9 j--; 10 while(i < j && a[i] <= temp) 11 i++; 12 if(i < j){//两两交换 13 int t = a[j]; 14 a[j] = a[i]; 15 a[i] = t; 16 } 17 } 18 a[s] = a[i];//把基准位置的值和序列位置的值互换 19 a[i] = temp; 20 quick_sort(a,s,i - 1); 21 quick_sort(a,i + 1,e); 22 } 23 int main() 24 { 25 int a[10] = {1,3,4,2,6,9,8,7,10,5}; 26 quick_sort(a,0,9); 27 for(int i = 0;i < 10;i++) 28 printf("%d ",a[i]); 29 return 0; 30 }
七.归并排序:
1 #include "stdio.h" 2 void merge(int *a,int s,int m,int e) 3 { 4 int temp[10];//临时存储数据 5 int l,r,k;//代表左右两个区间的指针 k代表临时数组的数的个数 6 l = s,r = m + 1,k = 0; 7 while(l <= m && r <= e){ 8 if(a[l] < a[r]) 9 temp[k++] = a[l++]; 10 else 11 temp[k++] = a[r++]; 12 } 13 while(l <= m) 14 temp[k++] = a[l++]; 15 while(r <= e) 16 temp[k++] = a[r++]; 17 for(int i = 0;i < k;i++) 18 a[s + i] = temp[i]; 19 } 20 void merge_sort(int *a,int s,int e) 21 { 22 if(s == e) return;//如果此序列为只有一个数的子序列了,则不需要排序了 23 else{ 24 int m = (s + e) / 2; 25 merge_sort(a,0,m); 26 merge_sort(a,m + 1,e); 27 merge(a,s,m,e); 28 } 29 } 30 int main() 31 { 32 int a[10] = {1,3,4,2,6,9,8,7,10,5}; 33 merge_sort(a,0,9); 34 for(int i = 0;i < 10;i++) 35 printf("%d ",a[i]); 36 return 0; 37 }