码迷,mamicode.com
首页 > 编程语言 > 详细

冒泡、选择、插入排序

时间:2015-04-13 22:37:10      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:

冒泡、选择、插入排序

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h>
  4 
  5 //数组元素的个数
  6 #define SIZE 15 
  7 
  8 //初始化数组
  9 void initArray(int *arr, int len);
 10 
 11 //打印数组元素
 12 void printArray(int *arr, int len);
 13 
 14 //交换两个数
 15 void swap(int *a, int *b);
 16 
 17 //冒泡排序
 18 void bubbleSort(int *arr, int len);
 19 
 20 //选择排序
 21 void selectSort(int *arr, int len);
 22 //返回最大值元素的下标
 23 int max_key(int *arr, int beg, int end);
 24 
 25 //插入排序
 26 void insertSort(int *arr, int len);
 27 
 28 int main()
 29 {
 30     int arr[SIZE];
 31     initArray(arr,SIZE);
 32     printArray(arr,SIZE);
 33 //    bubbleSort(arr,SIZE);
 34 //    selectSort(arr,SIZE);
 35     insertSort(arr,SIZE);
 36     printArray(arr,SIZE);
 37     return 0;
 38 }
 39 
 40 void initArray(int *arr, int len)
 41 {
 42     int i;
 43     //随机生成数组元素
 44     for(i = 0; i < len; i++)
 45         arr[i] = rand() % 1000;
 46 }
 47 
 48 void printArray(int *arr, int len)
 49 {
 50     int i;
 51     for(i = 0; i < len; i++)
 52         printf("%4d",*(arr+i));
 53     printf("\n");
 54 }
 55 
 56 //通过位操作交换两个数
 57 void swap(int *a, int *b)
 58 {
 59     *a ^= *b;//记录差异
 60     *b ^= *a;//翻转
 61     *a ^= *b;//翻转
 62 }
 63 
 64 //来回冒泡排序
 65 void bubbleSort(int *arr, int len)
 66 {
 67     int index;//工作指针
 68     int top;//记录右边排好序的第一个元素的下标
 69     int bottom;//记录左边排好序的最后一个元素的下标
 70 
 71     top = len;
 72     bottom = -1;
 73 
 74     while(bottom <= top)
 75     {
 76         //从左往右
 77         for(index = bottom+1; index < top-1; index++)
 78             if(arr[index] > arr[index+1])
 79                 swap(&arr[index],&arr[index+1]);
 80         top--;
 81         //从右往左
 82         for(index = top-1; index > bottom+1; index--)
 83             if(arr[index] < arr[index-1])
 84                 swap(&arr[index],&arr[index-1]);
 85         bottom++;
 86     }
 87 }
 88 //返回最大元素的下标
 89 int max_key(int *arr, int beg, int end)
 90 {
 91     int i;
 92     int largest = beg;
 93     for(i = beg+1; i <= end; i++)
 94         if(arr[i] > arr[largest])
 95             largest = i;
 96     return largest;
 97 }
 98 //选择排序
 99 void selectSort(int *arr, int len)
100 {
101     int i, max;
102     for(i = len-1; i > 0; i--)
103     {
104         max = max_key(arr,0,i);
105         swap(&arr[max],&arr[i]);
106     }
107 }
108 
109 //插入排序
110 void insertSort(int *arr, int len)
111 {
112     int i;//工作指针
113     int first_unsorted;//第一个未排序元素下标
114     int current;//暂存待插入的元素
115 
116     for(first_unsorted = 1; first_unsorted < len; first_unsorted++)
117         if(arr[first_unsorted] < arr[first_unsorted-1])
118         {
119             //暂存元素
120             current = arr[first_unsorted];
121             i = first_unsorted;
122             do{
123                 arr[i] = arr[i-1];
124                 i--;
125             }while(i > 0 && arr[i-1] > current);
126             //插入元素
127             arr[i] = current;
128         }
129 }

 

冒泡、选择、插入排序

标签:

原文地址:http://www.cnblogs.com/cpsmile/p/4423227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!