每次面試,想必大家都會多多少少的遇到些算法題。忙里偷閑整理了幾個基本的算法,就當(dāng)是復(fù)習(xí)了,希望給需要的人作為參考!
以下這幾道算法,都是用oc語言寫的,大學(xué)那會學(xué)算法,是c++語言寫的,后來查資料也都是類似的C語言寫的,如今把她翻譯成了OC語言。
1.桶排序(原理自己查資料)
[self algorithms];//桶排序 o(m+n)
- (void)algorithms{
? ? NSArray *arr = @[@"5",@"3",@"5",@"2",@"8"];
? ? for(NSString*a? in arr) {
? ? ? ? ? ? intb = [aintValue];
? ? ? ? ? ? intc = [self.array[b]intValue];
? ? ? ? ? ? self.array[b] = [NSStringstringWithFormat:@"%d",c+1];
? ? }
//? ?for (int j=0;j<self.array.count; j++){//從小到大
? ? ? ? for(intj=10;j>0; j--){//從大到小
? ? ? ? ? ? int c = [self.array[j] intValue];
? ? ? ? if(c!=0){
? ? ? ? ? ?for(intk =0; k<c; k++){
?? ? ? ? ? ? ? ? NSLog(@"%@%d",@"桶排序",j);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
- (NSMutableArray *)array{
? ? if(!_array){
? ? ? ? _array= [[NSMutableArrayalloc]init];
? ? ? ? for(inti=0; i<11; i++) {
? ? ? ? ? ? _array[i]=@"0";
? ? ? ? }
? ? }
?? ?return _array;
}
2.冒泡排序
?[self bubble];//冒泡排序 o(n*n)
- (void)bubble{//最后我們總結(jié)一下:如果有 n 個數(shù)進(jìn)行排序,只需將 n-1 個數(shù)歸位,也就是說要進(jìn)行 n-1 趟操作
? ? NSArray *arr = @[@{@"q":@"5"},@{@"w":@"3"},@{@"e":@"5"},@{@"r":@"2"},@{@"t":@"8"}];
? ? NSMutableArray *mulArr= [[NSMutableArray alloc] initWithArray:arr];
? ? for(int k=0; k<arr.count-1; k++){
? ? ? ? for(inti=0; i<mulArr.count-k-1; i++){
? ? ? ? ? ? NSArray*arr = [mulArr[i]allKeys];
? ? ? ? ? ? NSString*value = [mulArr[i]valueForKey:arr[0]];
? ? ? ? ? ? int a = [value intValue];
? ? ? ? ? ? NSArray*arr1 = [mulArr[i+1]allKeys];
? ? ? ? ? ? NSString*value1 = [mulArr[i+1]valueForKey:arr1[0]];
? ? ? ? ? ? int ? b = [value1 ?intValue];
? ? ? ? ? ? if(a<b){
? ? ? ? ? ? ? ? NSDictionary*dic = mulArr[i] ;
? ? ? ? ? ? ? ? mulArr[i] = mulArr[i+1];
? ? ? ? ? ? ? ? mulArr[i+1] = dic;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? NSLog(@"%@%@",@"冒泡排序",mulArr);
}
3.快排
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@(6), @(1),@(2),@(7),@(9),@(3),@(4),@(5),@(10),@(8),nil];
? ? [self quicksortWithleft:0 WithRight:9 WithArr:arr];
? ? NSLog(@"%@",arr);
- (void)quicksortWithleft:(int)left WithRight:(int)right WithArr:(NSMutableArray*)a{
? ? if(left>=right){
? ? ? ? return;
? ? }
?? int temp=[a[left]intValue];//temp中存的就是基準(zhǔn)數(shù)
?? inti=left;
?? intj=right;
? ? while(i!=j)
? ? {
? ? ? ? //順序很重要,要先從右往左找
? ? ? ? while([a[j]intValue]>=temp && i<j){
? ? ? ? ? ? j--;
? ? ? ? }
?? ? ? ? //再從左往右找
? ? ? ? while([a[i]intValue]<=temp && I<j){
? ? ? ? ? ? i++;
? ? ? ? }
? ? ? ? //交換兩個數(shù)在數(shù)組中的位置 ,當(dāng)哨兵i和哨兵j沒有相遇時
? ? ? ? if(I<j){
? ? ? ? ? ? NSNumber*t=a[i];
? ? ? ? ? ? a[i]=a[j];
? ? ? ? ? ? a[j]=t;
? ? ? ? }
? ? }
? ? //最終將基準(zhǔn)數(shù)歸位
? ? a[left]=a[i];
? ? a[i]=[NSNumber numberWithInt:temp];
? ? [self quicksortWithleft:left WithRight:i-1 WithArr:a];//繼續(xù)處理左邊的,這里是一個遞歸的過程
? ? [self quicksortWithleft:i+1 WithRight:right WithArr:a];//繼續(xù)處理右邊的,這里是一個遞歸的過程
}
4.直接插入排序
//直接插入排序 o(n*n)
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@(6), @(1),@(2),@(7),@(9),@(3),@(4),@(5),@(10),@(8),nil];
?? ?[self insertSortWithArr:arr];
//當(dāng)數(shù)據(jù)正序時,執(zhí)行效率最好,每次插入都不用移動前面的元素,時間復(fù)雜度為O(N);當(dāng)數(shù)據(jù)反序時,執(zhí)行效率最差,每次插入都要前面的元素后移,時間復(fù)雜度為O(N2)。所以,數(shù)據(jù)越接近正序,直接插入排序的算法性能越好。
- (void)insertSortWithArr:(NSMutableArray*)arr{
? ? for(inti=1; i<arr.count; i++){
? ? ? ? int temp = [arr[i] intValue];
? ? ? ? int j;
? ? ? ? for(j=i-1; j>=0&&[arr[j] intValue]>temp? ;j--) {
? ? ? ? ? ? arr[j+1] = arr[j];
? ? ? ? }
? ? ? ? arr[j+1] = [NSNumber numberWithInt:temp];
? ? }
?? ? NSLog(@"%@",arr);
}
5.選擇排序
//選擇排序 o(n*n)
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@(6), @(1),@(2),@(7),@(9),@(3),@(4),@(5),@(10),@(8),nil];
? ? [self selectionWithArr:arr];
//選擇排序的思想:選擇排序算法的基本思想是對a[1]...a[r]進(jìn)行r-1遍處理,第i遍處理 是將a[i],?,a[r]中最小者d的位置找到,然后與a[i]交換位置。這樣,經(jīng)過r-1遍處理之后,較小的r-1個元素的位置已經(jīng)是正確的了
- (void)selectionWithArr:(NSMutableArray*)arr{
? ? for(inti =0;i<arr.count-1; i++){
? ? ? ? //找出最小數(shù)的下標(biāo)
? ? ? ? intmin = i;
? ? ? ? for(intj=i+1; j<arr.count; j++){?
? ? ? ? ? ? if([arr[j] intValue]<[arr[min] intValue]) {
? ? ? ? ? ? ? ? min = j;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //交換位置
? ? ? ? NSNumber*t=arr[min];
? ? ? ? arr[min]=arr[i];
? ? ? ? arr[i]=t;
? ? }
? ? NSLog(@"%@",arr);
}
以上有些算法沒有表明原理,請自己查詢。建議在對這些算法原理基本弄明白以后再去參考此代碼,可以更加容易看懂?。ㄉ厦娴拇a都是可以運(yùn)行的,并且運(yùn)行結(jié)果正確,如果你們有更簡潔的寫法可以提出來,如果有其他語言的版本,歡迎貼出來大家共享)