黑马程序员技术交流社区

标题: 用冒泡和选择排序的方式对数组进行排序 [打印本页]

作者: huh    时间: 2015-12-29 19:39
标题: 用冒泡和选择排序的方式对数组进行排序
  1. /*
  2. main.m
  3. 用冒泡和选择排序的方式对数组进行排序
  4. 外层循环(这数组有多少个元素,就应该循环多少次)
  5. 内层循环(每次循环都是求1次最值<最大值/最小值>)
  6. 选择排序
  7. 分析:
  8. 选择排序就是,
  9. 先假设一个元素为最值(最小/最大值),拿这个元素跟另外的元素进行比较,找出真正最值出来!(内循环)

  10. 获得最值元素的下标,将最值元素的值放在第一个下标位置上,
  11. 原第一个元素的值,给了上一轮的最值(也就是进行交换)(外循环)

  12. 再次循环,忽略第一个下标!(int minIndex = i; int j=i)
  13. 选择排序的核心,假设个最值,跟别的元素比较,得出真正最值!
  14. 选择好此下标,将此下标的值与第一个元素的值进行互换!

  15. 冒泡排序
  16. 冒泡排序的核心,两个相邻的元素进行比较,得出最值,进行交换,将最值放到最后!
  17. 分析:
  18. 两个相邻元素进行比较,if(arr[j]>arr[j+1])
  19. 将最值放在最后! -- 比较后,直接互换位置
  20. 忽略已经排序好的元素! -- j<len-i

  21. */
  22. #import <Foundation/Foundation.h>
  23. int *minArr(int arr[],int len);
  24. int *maxArr(int arr[],int len);
  25. int *minMaoPao(int arr[],int len);
  26. int *maxMaoPao(int arr[], int len);
  27. int main(int argc, const char * argv[]) {
  28.    
  29.     int arr [5] ={8,9,5,3,4};
  30.     //数组元素从小到大打印
  31.     //    int *minAr = minArr(arr,5);
  32.     //    for (int i=0; i<5; i++) {
  33.     //        printf("%d",minAr[i]);
  34.     //    }
  35.     //    printf("\n");
  36.     //
  37.     //    //数组元素从大到小打印
  38.     //    int *maxAr = maxArr(arr,5);
  39.     //    for (int i = 0; i<5; i++) {
  40.     //        printf("%d",maxAr[i]);
  41.     //    }
  42.     //    printf("\n");
  43.    
  44.     //    //数组元素从小到大打印
  45.     //    int *minMaoPaoArr = minMaoPao(arr,5);
  46.     //    for (int i = 0; i<5; i++) {
  47.     //        printf("%d",minMaoPaoArr[i]);
  48.     //    }
  49.     //    printf("\n");
  50.    
  51.     //数组元素从大到小打印
  52.     int *maxMaoPaoArr = maxMaoPao(arr,5);
  53.     for (int i = 0; i<5; i++) {
  54.         printf("%d",maxMaoPaoArr[i]);
  55.     }
  56.     printf("\n");
  57.    
  58.     return 0;
  59. }

  60. //使用冒泡排序的方法,从小到大进行排序
  61. int *minMaoPao(int arr[],int len){
  62.     int temp =0;
  63.     for (int i =0; i<len; i++) {//外层循环,
  64.         for (int j=0; j<len-i; j++) {//内层循环,取出最值! j<len-i,忽略以排序好的值
  65.             if(arr[j]>arr[j+1]){//两个相邻的元素进行比较,大的换到后面去!
  66.                 temp = arr[j];
  67.                 arr[j] =arr[j+1];
  68.                 arr[j+1] = temp;
  69.             }
  70.         }
  71.     }
  72.     return arr;
  73. }

  74. //使用冒泡排序的方法,将数组元素,从大到小排序
  75. int *maxMaoPao(int arr[], int len){
  76.     int temp = 0;
  77.     for (int i = 0; i<len; i++) {
  78.         for (int j=0; j<len-i; j++) {
  79.             if (arr[j]<arr[j+1]) {
  80.                 temp = arr[j];
  81.                 arr[j] = arr[j+1];
  82.                 arr[j+1] = temp;
  83.             }
  84.         }
  85.     }
  86.     return arr;
  87. }
  88. //将数组元素从小到大排序
  89. int *minArr(int arr[],int len){
  90.    
  91.     int temp = 0;
  92.     for (int i = 0; i<len; i++) {
  93.         //去除已经排序好的元素
  94.         //假设一个元素为最值!arr[0]/arr[1]/arr[2]...
  95.         int minIndex = i;
  96.         for (int j=i; j<len; j++) {//j=i,再次循环时,会忽略以排好的元素
  97.             if (arr[minIndex]>arr[j]) {
  98.                 minIndex =j;//求出最小值的下标
  99.             }
  100.         }
  101.         //既要将最小值给arr[0]的元素,又要将原本arr[0]的值,拿去跟别的值进行比较 --交换
  102.         temp = arr[minIndex];
  103.         arr[minIndex] = arr[i];
  104.         arr[i]=temp;
  105.     }
  106.     return arr;//这时候返回的是个指针?也就是首字母的地址
  107. }
  108. //将数组元素从大到小的排序
  109. int *maxArr(int arr[],int len){
  110.     int temp = 0;
  111.     for (int i = 0; i<len; i++) {
  112.         int maxIndex = i;
  113.         for (int j = i; j<len; j++) {//注意:j=i,这是忽略已经排好序的元素
  114.             if (arr[maxIndex]<arr[j]) {
  115.                 maxIndex = j;
  116.             }
  117.         }
  118.         //交换值
  119.         temp = arr[maxIndex];
  120.         arr[maxIndex] = arr[i];
  121.         arr[i] = temp;
  122.     }
  123.    
  124.     return arr;
  125. }
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2