黑马程序员技术交流社区
标题:
用冒泡和选择排序的方式对数组进行排序
[打印本页]
作者:
huh
时间:
2015-12-29 19:39
标题:
用冒泡和选择排序的方式对数组进行排序
/*
main.m
用冒泡和选择排序的方式对数组进行排序
外层循环(这数组有多少个元素,就应该循环多少次)
内层循环(每次循环都是求1次最值<最大值/最小值>)
选择排序
分析:
选择排序就是,
先假设一个元素为最值(最小/最大值),拿这个元素跟另外的元素进行比较,找出真正最值出来!(内循环)
获得最值元素的下标,将最值元素的值放在第一个下标位置上,
原第一个元素的值,给了上一轮的最值(也就是进行交换)(外循环)
再次循环,忽略第一个下标!(int minIndex = i; int j=i)
选择排序的核心,假设个最值,跟别的元素比较,得出真正最值!
选择好此下标,将此下标的值与第一个元素的值进行互换!
冒泡排序
冒泡排序的核心,两个相邻的元素进行比较,得出最值,进行交换,将最值放到最后!
分析:
两个相邻元素进行比较,if(arr[j]>arr[j+1])
将最值放在最后! -- 比较后,直接互换位置
忽略已经排序好的元素! -- j<len-i
*/
#import <Foundation/Foundation.h>
int *minArr(int arr[],int len);
int *maxArr(int arr[],int len);
int *minMaoPao(int arr[],int len);
int *maxMaoPao(int arr[], int len);
int main(int argc, const char * argv[]) {
int arr [5] ={8,9,5,3,4};
//数组元素从小到大打印
// int *minAr = minArr(arr,5);
// for (int i=0; i<5; i++) {
// printf("%d",minAr[i]);
// }
// printf("\n");
//
// //数组元素从大到小打印
// int *maxAr = maxArr(arr,5);
// for (int i = 0; i<5; i++) {
// printf("%d",maxAr[i]);
// }
// printf("\n");
// //数组元素从小到大打印
// int *minMaoPaoArr = minMaoPao(arr,5);
// for (int i = 0; i<5; i++) {
// printf("%d",minMaoPaoArr[i]);
// }
// printf("\n");
//数组元素从大到小打印
int *maxMaoPaoArr = maxMaoPao(arr,5);
for (int i = 0; i<5; i++) {
printf("%d",maxMaoPaoArr[i]);
}
printf("\n");
return 0;
}
//使用冒泡排序的方法,从小到大进行排序
int *minMaoPao(int arr[],int len){
int temp =0;
for (int i =0; i<len; i++) {//外层循环,
for (int j=0; j<len-i; j++) {//内层循环,取出最值! j<len-i,忽略以排序好的值
if(arr[j]>arr[j+1]){//两个相邻的元素进行比较,大的换到后面去!
temp = arr[j];
arr[j] =arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
//使用冒泡排序的方法,将数组元素,从大到小排序
int *maxMaoPao(int arr[], int len){
int temp = 0;
for (int i = 0; i<len; i++) {
for (int j=0; j<len-i; j++) {
if (arr[j]<arr[j+1]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
//将数组元素从小到大排序
int *minArr(int arr[],int len){
int temp = 0;
for (int i = 0; i<len; i++) {
//去除已经排序好的元素
//假设一个元素为最值!arr[0]/arr[1]/arr[2]...
int minIndex = i;
for (int j=i; j<len; j++) {//j=i,再次循环时,会忽略以排好的元素
if (arr[minIndex]>arr[j]) {
minIndex =j;//求出最小值的下标
}
}
//既要将最小值给arr[0]的元素,又要将原本arr[0]的值,拿去跟别的值进行比较 --交换
temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i]=temp;
}
return arr;//这时候返回的是个指针?也就是首字母的地址
}
//将数组元素从大到小的排序
int *maxArr(int arr[],int len){
int temp = 0;
for (int i = 0; i<len; i++) {
int maxIndex = i;
for (int j = i; j<len; j++) {//注意:j=i,这是忽略已经排好序的元素
if (arr[maxIndex]<arr[j]) {
maxIndex = j;
}
}
//交换值
temp = arr[maxIndex];
arr[maxIndex] = arr[i];
arr[i] = temp;
}
return arr;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2