關於NSArray的幾種排序:,NSArray幾種排序:
#利用數組的sortedArrayUsingComparator調用 NSComparator
其中NSComparator其實就是一個返回NSComparisonResult的block。
typedef NSComparisonResult (^NSComparator)(id obj1,id obj2); 其中obj1、obj2其實是NSArray中的元素
resultArray = [arrayDic <span style="color:#009900;">sortedArrayUsingComparator:</span>^NSComparisonResult(id obj1, id obj2) { NSNumber * number1 = [[obj1 allKeys] objectAtIndex:0]; NSNumber * number2 = [[obj2 allKeys] objectAtIndex:0]; NSComparisonResult result = [number1 compare:number2]; return result == NSOrderedAscending; }];
#利用數組的sortedArrayUsingFunction 調用 對應方法customSort
NSInteger <span style="color:#ff9900;">sortByID</span>(id obj1, id obj2, void *context){NSString *str1 =(NSString*) obj1; // ibj1 和 obj2 來自與你的數組中,其實,個人覺得是蘋果自己實現了一個冒泡排序給大家使用NSString *str2 =(NSString *) obj2;if (str1.length < str2.length) {<span style="white-space:pre"></span>return NSOrderedDescending;}else if(str1.length == str2.length){<span style="white-space:pre"></span>return NSOrderedSame;}<span style="white-space:pre"></span>return NSOrderedAscending;}
NSArray *sortedArray =[arr sortedArrayUsingFunction:sortByID context:nil];
#利用數組的sortedArrayUsingSelector調用 對應的SEL的方法
注意selector的方法是對數組元素而言的方法,假如資料元素沒有compare:方法,可以通過擴充數組元素的類增加相應的方法。
NSMutableArray *arrayDic = [NSMutableArray arrayWithObjects: [NSDictionary dictionaryWithObjectsAndKeys:@"Obj0", [NSNumber numberWithInt:0], nil], [NSDictionary dictionaryWithObjectsAndKeys:@"Obj5", [NSNumber numberWithInt:5], nil], [NSDictionary dictionaryWithObjectsAndKeys:@"Obj2", [NSNumber numberWithInt:2], nil], [NSDictionary dictionaryWithObjectsAndKeys:@"Obj3", [NSNumber numberWithInt:3], nil], [NSDictionary dictionaryWithObjectsAndKeys:@"Obj1", [NSNumber numberWithInt:1], nil], [NSDictionary dictionaryWithObjectsAndKeys:@"Obj4", [NSNumber numberWithInt:4], nil], nil];#ifdef sortedArrayUsingSelector resultArray = [arrayDic sortedArrayUsingSelector:@selector(compare:)];
因為數組中元素對應的是字典,所以對字典的類進行擴充
@implementation NSDictionary (extend)- (NSComparisonResult)compare: (NSDictionary *)otherDictionary{ NSNumber *number2 = [[otherDictionary allKeys] objectAtIndex:0]; NSDictionary *tempDictionary = (NSDictionary *)self; NSNumber *number1 = [[tempDictionary allKeys] objectAtIndex:0]; NSComparisonResult result = [number1 compare:number2]; // return result == NSOrderedDescending; // 升序 return result == NSOrderedAscending; // 降序}
#利用數組的sortUsingDescriptors調用NSSortDescriptor
NSSortDescriptor 可以簡單的理解為 指定對象的某屬性的比較描述。
/** * 可以很方便的根據model對象中的某個屬性進行排序 * sortDescriptor1 數組根據name進行升序排 * sortDescriptor2 數組根據age進行降序排 * 同時將兩種sortDescriptor加入數組,是指先按照name排序,name相同的按照age排序 */ Person *person1 = [[Person alloc] init]; [person1 setName:@"ABC"]; [person1 setAge:24]; Person *person2 = [[Person alloc] init]; [person2 setName:@"ACB"]; [person2 setAge:22]; Person *person3 = [[Person alloc] init]; [person3 setName:@"ABD"]; [person3 setAge:33]; NSMutableArray *array = [NSMutableArray arrayWithObjects:person1, person2, person3, nil]; NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor <span style="color:#ff0000;">sortDescriptorWithKey</span>:@"_name" ascending:YES]; NSSortDescriptor *sortDescriptor2 = [NSSortDescriptor <span style="color:#ff0000;">sortDescriptorWithKey</span>:@"_age" ascending:NO]; resultArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor1,sortDescriptor2,nil]]; for(NSInteger i = 0; i < [resultArray count]; i++) { NSLog(@"%@--------%d\n", [[resultArray objectAtIndex:i] name], [[resultArray objectAtIndex:i] age]); }
C++數組排序有哪幾種演算法?
插入排序演算法
1.從有序數列和無序數列{a2,a3,…,an}開始進行排序;
2.處理第i個元素時(i=2,3,…,n) , 數列{a1,a2,…,ai-1}是已有序的,而數列{ai,ai+1,…,an}是無序的。用ai與ai-1,a i-2,…,a1進行比較,找出合適的位置將ai插入;
3.重複第二步,共進行n-1次插入處理,數列全部有序。
void insertSort(Type* arr,long len)/*InsertSort algorithm*/
{
long i=0,j=0;/*iterator value*/
Type tmpData;
assertF(arr!=NULL,"In InsertSort sort,arr is NULL\n");
for(i=1;i<len;i++)
{
j=i;
tmpData=*(arr + i);
while(j > 0 && tmpData < arr[j-1])
{
arr[j]=arr[j-1];
j--;
}
arr[j]=tmpData;
}
}
歸併排序 :歸併排序是多次將兩個或兩個以上的有序表合并成一個新的有序表。最簡單的歸併是直接將兩個有序的子表合并成一個有序的表。
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h >
void merge(int array[], int p, int q, int r)
{
int* temp = new int [r-p+1]; //申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并後的序列
int m=p;
int n=q+1;
int k = 0;
while((m<=q)&&( n<=r)) //比較兩個下標所指向的元素,選擇相對小的元素放入到合并空間,並移動下標到下一位置
{
if(array[m]<array[n])
{
temp[k] = array[m];
m++;
}
else
{
temp[k] = array[n];
n++;
}
k++;
}
while(m<=q) //若第一個序列有剩餘,直接拷貝出來粘到定序序列尾
{
temp[k] = array[m];
k++;
m++;
}
while(n<=r) //若第二個序列有剩餘,直接拷貝出來粘到定序序列尾
{
temp[k] = array[n];
k++;
n++;
}
for (int i = 0; i < (r - p +1); i++) //將排序好的序列拷貝回數組中
{
array[p+i] = temp[i];
}
}
void mergesort(int A[],int p,int r)
{
if (p<r)
{
int q = (p+r)/2;
mergesort(A,p,q);
mergesort(A,q+1,r);
merge(A,p,q,r);
......餘下全文>>
幾種常用排序演算法
/** * @author txin0814 E-mail:txin0814@sina.com * @version 1.0 * @date Apr 1, 2011 2:28:06 PM * @description 排序類的 基類 */ public abstract class BaseSorter { public abstract void sort(E[] array,int from,int len); public final void sort(E[] array){ sort(array,0,array.length); } protected final void swap(E[] array,int from,int to){ E temp = array[from]; array[from] = array[to]; array[to] = temp; } } /** * @author txin0814 E-mail:txin0814@sina.com * @version 1.0 * @date Apr 1, 2011 2:34:47 PM * @description 插入排序 該演算法在資料規模小的時候十分高效, * 該演算法每次插入第K+1到前K個有序數組中一個合適位置, * K從0開始到N-1,從而完成排序 */ public class InsertSorter extends BaseSorter{ //當SORT_TYPE為false時按降序排列 為TRUE時按升序排列 public static boolean SORT_TYPE = false; @Override public void sort(E[] array, int from, int len) { E tmp=null; for(int i=from+1;ifrom;j--){ if(SORT_TYPE){ if(tmp.compareTo(array[j-1])0){ array[j]=array[j-1]; }else break; } } array[j]=tmp; } /*for (E e : array) { System.out.println(e); }*/ } public static void main(String[] args) { Integer[] elem = {32, 43, 1, 3, 54, 4, 19}; InsertSorter insertsort = new InsertSorter(); //InsertSorter.SORT_TYPE = true; insertsort.sort(elem); for (Integer integer : elem) { System.out.println(integer); } } } /** * @author txin0814 E-mail:txin0814@sina.com * @version 1.0 * @date Apr 1, 2011 2:53:29 PM * @description 冒泡排序 演算法思想是每次從數組末端開始比較相鄰兩元素,把第i小的冒泡到數組的第i個位置。) */ public class BubbleSorter extends BaseSorter { //當SORT_TYPE為false時按降序排列 為TR......餘下全文>>